none
comando utilizando o cmdshell RRS feed

  • 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!


    quarta-feira, 3 de setembro de 2014 13:51

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

    sexta-feira, 5 de setembro de 2014 19:06
  • 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 Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    quarta-feira, 3 de setembro de 2014 17:14
    Moderador
  • 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

    sexta-feira, 5 de setembro de 2014 19:09

Todas as Respostas

  • Elisangela,

    Suas variaveis @P_JAVA e @P_SERVICO tem valores ?

    Você pode estar somando valores NULL.


    Tulio Rosa | http://tuliorosa.com.br | Se resolveu seu problema, marque como resposta ou vote como útil

    quarta-feira, 3 de setembro de 2014 14:32
  • 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 Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    quarta-feira, 3 de setembro de 2014 17:14
    Moderador
  • 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

    sexta-feira, 5 de setembro de 2014 19:06
  • 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

    sexta-feira, 5 de setembro de 2014 19:09