【问题标题】:xp_cmdshell copy command seldom failsxp_cmdshell 复制命令很少失败
【发布时间】:2011-02-21 12:15:07
【问题描述】:

我在 Windows Server 2003 机器上运行 SQL Server 2005。

我需要将小文本文件累积成一个更大的文件。

所以我用

exec xp_cmdshell @sql

在哪里@sql=

'copy /b'+@sourcePath+@sourceFile+' '+@destinationPath+@NewFileName

源路径和目标路径都在单独的服务器上。

这个过程很少失败,我在事件或 SQL Server 日志中找不到任何其他内容。

xp_cmdshell 的外围区域配置也已启用。

请帮忙.....

【问题讨论】:

    标签: sql sql-server-2005 windows-server-2003 xp-cmdshell


    【解决方案1】:

    我刚刚在我的 sql server 2005 上对此进行了测试,EXEC dbo.xp_cmdshell 总是以表格的形式返回输出(即使是虚假命令)。对于 C#,如果您使用 ExecuteNonQuery 调用此代码,则使用 ExecuteReader 调用它并读取输出。或者,您可以将输出转储到表格中,以便您以后可以在闲暇时查看它。像这样创建一个表:

    CREATE TABLE [dbo].[xp_cmdShellOutput](
        [errorMsg] [nvarchar](max) NULL
    )
    

    然后使用此代码:

    DECLARE @sql AS VARCHAR(600)
    
    SELECT  @sql = '<your command>'
    
    INSERT  dbo.xp_cmdShellOutput(errorMsg)
    EXEC dbo.xp_cmdshell @sql
    

    【讨论】:

    • 嗨,Sem,谢谢!我也这么认为,但它是我正在调试的 SQL 中的遗留代码,需要帮助。此外,它以二进制复制,即复制 /b
    • @Daniel 我并没有真正听懂你想说的话。你说这是遗留代码。你的意思是你根本没有从EXEC dbo.xp_cmdshell 得到任何输出?
    • @Sem,代码运行良好,但每周一次失败,因此为了调试它,我添加了捕获并在此 xp_cmdshell 复制命令中发现了错误。此外,在未能关联问题时,我没有收到任何系统或应用程序日志。
    • @Daniel。那么,您的问题就解决了(因为您可以获得调试信息)? (你没有得到任何日志并不奇怪。从操作系统的角度来看,dbo.xp_cmdshell 只是用户在 shell 中执行的命令。为什么要记录?如果失败,用户应该读取命令提供的错误信息)。
    • @Sem,我得到的只是 SQLSTATE 42000 和 ERROR 50000(表示我的自定义错误日志)。我无法找到错误的根本原因。在网上书籍和@net 上,我了解到 SQLSTATE 42000 非常通用。
    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2011-04-18
    • 2012-06-05
    相关资源
    最近更新 更多