Usuário com melhor resposta
comando utilizando o cmdshell

Pergunta
-
Bom dia.
Estou com um problema no trabalho, fiz uma procedure para executar o arquivo .jar em sql dinâmico usando o xp_cmdshell.
Quando executo esse comando fora da procedure funciona corretamente, segue comando:
--esse comando funciona
INSERT INTO #temp exec @ret = master.dbo.xp_cmdshell '"C:\Program Files\Java\jre6\bin\java.exe" -jar D:\MSSQL\BACKUP\teste\Job\JavaBatch\teste_RP.jar'
Agora quando executo dentro da procedure utilizando variáveis e sql dinâmico ocorre o seguinte erro:
(2 row(s) affected)
result
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta.
NULL
Procedure:
AS BEGIN
DECLARE @RET VARCHAR(100),
@CAMINHO VARCHAR(100),
@aux2 varchar(1000),
@AUX1 VARCHAR(200),
@RESULTADO VARCHAR(1000),
@CMD varchar(8000)
BEGIN TRY
SET @CMD =' ''"' + @P_JAVA + '"' + ' -jar ' + @P_SERVICO + ''''
PRINT @CMD
CREATE TABLE #temp(result varchar(1000))
INSERT INTO #temp exec @ret = master.dbo.xp_cmdshell @CMD
SELECT TOP 1 @RESULTADO = CONVERT(VARCHAR(1000),RESULT) FROM #temp
SELECT * FROM #temp....
Obrigada!
Respostas
-
Bom dia.
Estou com um problema no trabalho, fiz uma procedure para executar o arquivo .jar em sql dinâmico usando o xp_cmdshell.
Quando executo esse comando fora da procedure funciona corretamente, segue comando:
--esse comando funciona
INSERT INTO #temp exec @ret = master.dbo.xp_cmdshell '"C:\Program Files\Java\jre6\bin\java.exe" -jar D:\MSSQL\BACKUP\teste\Job\JavaBatch\teste_RP.jar'
Agora quando executo dentro da procedure utilizando variáveis e sql dinâmico ocorre o seguinte erro:
(2 row(s) affected)
result
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta.
NULL
Procedure:
AS BEGIN
DECLARE @RET VARCHAR(100),
@CAMINHO VARCHAR(100),
@aux2 varchar(1000),
@AUX1 VARCHAR(200),
@RESULTADO VARCHAR(1000),
@CMD varchar(8000)
BEGIN TRY
SET @CMD =' ''"' + @P_JAVA + '"' + ' -jar ' + @P_SERVICO + ''''
PRINT @CMD
CREATE TABLE #temp(result varchar(1000))
INSERT INTO #temp exec @ret = master.dbo.xp_cmdshell @CMD
SELECT TOP 1 @RESULTADO = CONVERT(VARCHAR(1000),RESULT) FROM #temp
SELECT * FROM #temp....
Obrigada!
Elisangela,
Por mais que exista este tipo de funcionalidade, eu particularmente não acho que o SQL Server é responsável ou indicado em fazer este tipo de processamento, ainda mais através do XP_CMDShell que é um recurso que somente usuários com permissões administrativas podem fazer uso, justamente pelo risco que pode representar ao ambiente.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com
- Sugerido como Resposta Durval RamosModerator terça-feira, 9 de setembro de 2014 18:14
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:20
-
Elisangela,
Se no seu "PRINT @CMD" da procedure aparece o caminho correto, talvez seria interessante você tentar obter o resultado do retorno e posteriormente inserir na tabela temporária (caso seja necessário).
Veja uma sugestão para adaptar ao seu script T-SQL:
... AS BEGIN DECLARE @RET VARCHAR(100), @CAMINHO VARCHAR(100), @aux2 varchar(1000), @AUX1 VARCHAR(200), @RESULTADO VARCHAR(1000), @CMD varchar(8000) BEGIN TRY SET @CMD =' ''"' + @P_JAVA + '"' + ' -jar ' + @P_SERVICO + '''' EXEC @ret = master.dbo.xp_cmdshell @CMD DECLARE @temp TABLE (RESULT varchar(1000)); INSERT INTO @temp (RESULT) VALUES(@ret); SELECT * FROM @temp; SELECT TOP 1 @RESULTADO = RESULT FROM @temp; SELECT @RESULTADO AS RESULTADO; ...
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Durval RamosModerator terça-feira, 9 de setembro de 2014 18:14
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:20
-
Elisange,
Estas duas variáveis que você esta utilizando no XP_CMDShell estão recebendo valores de que forma?
Veja estes exemplos de como passar valores para uma variável no comando SQLCMD:
Set LinhaValor=%1 @Echo "Executando o Script" sqlcmd -SSAOM4036\SQLEXPRESS -E -v Valor=%LinhaValor% -i teste1.sql
:setvar Linha 10 USE Master Select * from Valores Where Codigo = $(Linha)
Talvez isso pode te ajudar, mas não diretamente no XP_CMDShell, mas sim em utilizar um arquivo .bat no XP_CMDShel..Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:20
Todas as Respostas
-
-
Elisangela,
Se no seu "PRINT @CMD" da procedure aparece o caminho correto, talvez seria interessante você tentar obter o resultado do retorno e posteriormente inserir na tabela temporária (caso seja necessário).
Veja uma sugestão para adaptar ao seu script T-SQL:
... AS BEGIN DECLARE @RET VARCHAR(100), @CAMINHO VARCHAR(100), @aux2 varchar(1000), @AUX1 VARCHAR(200), @RESULTADO VARCHAR(1000), @CMD varchar(8000) BEGIN TRY SET @CMD =' ''"' + @P_JAVA + '"' + ' -jar ' + @P_SERVICO + '''' EXEC @ret = master.dbo.xp_cmdshell @CMD DECLARE @temp TABLE (RESULT varchar(1000)); INSERT INTO @temp (RESULT) VALUES(@ret); SELECT * FROM @temp; SELECT TOP 1 @RESULTADO = RESULT FROM @temp; SELECT @RESULTADO AS RESULTADO; ...
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval RamosMicrosoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Durval RamosModerator terça-feira, 9 de setembro de 2014 18:14
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:20
-
Bom dia.
Estou com um problema no trabalho, fiz uma procedure para executar o arquivo .jar em sql dinâmico usando o xp_cmdshell.
Quando executo esse comando fora da procedure funciona corretamente, segue comando:
--esse comando funciona
INSERT INTO #temp exec @ret = master.dbo.xp_cmdshell '"C:\Program Files\Java\jre6\bin\java.exe" -jar D:\MSSQL\BACKUP\teste\Job\JavaBatch\teste_RP.jar'
Agora quando executo dentro da procedure utilizando variáveis e sql dinâmico ocorre o seguinte erro:
(2 row(s) affected)
result
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
A sintaxe do nome do arquivo, pasta ou nome do volume está incorreta.
NULL
Procedure:
AS BEGIN
DECLARE @RET VARCHAR(100),
@CAMINHO VARCHAR(100),
@aux2 varchar(1000),
@AUX1 VARCHAR(200),
@RESULTADO VARCHAR(1000),
@CMD varchar(8000)
BEGIN TRY
SET @CMD =' ''"' + @P_JAVA + '"' + ' -jar ' + @P_SERVICO + ''''
PRINT @CMD
CREATE TABLE #temp(result varchar(1000))
INSERT INTO #temp exec @ret = master.dbo.xp_cmdshell @CMD
SELECT TOP 1 @RESULTADO = CONVERT(VARCHAR(1000),RESULT) FROM #temp
SELECT * FROM #temp....
Obrigada!
Elisangela,
Por mais que exista este tipo de funcionalidade, eu particularmente não acho que o SQL Server é responsável ou indicado em fazer este tipo de processamento, ainda mais através do XP_CMDShell que é um recurso que somente usuários com permissões administrativas podem fazer uso, justamente pelo risco que pode representar ao ambiente.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com
- Sugerido como Resposta Durval RamosModerator terça-feira, 9 de setembro de 2014 18:14
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:20
-
Elisange,
Estas duas variáveis que você esta utilizando no XP_CMDShell estão recebendo valores de que forma?
Veja estes exemplos de como passar valores para uma variável no comando SQLCMD:
Set LinhaValor=%1 @Echo "Executando o Script" sqlcmd -SSAOM4036\SQLEXPRESS -E -v Valor=%LinhaValor% -i teste1.sql
:setvar Linha 10 USE Master Select * from Valores Where Codigo = $(Linha)
Talvez isso pode te ajudar, mas não diretamente no XP_CMDShell, mas sim em utilizar um arquivo .bat no XP_CMDShel..Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com
- Marcado como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:20