【问题标题】:Can EXEC master..xp_cmdshell be used on a set of data?EXEC master..xp_cmdshell 可以用于一组数据吗?
【发布时间】:2010-09-28 06:34:53
【问题描述】:

我有一个 Windows shell 命令我想为表中的每一行运行一次(通过 EXEC master..xp_cmdshell)。我正在使用来自各个领域的信息来构建命令输出。

我对编写 T-SQL 程序(而不是单独的查询)是相对论的新手,并且无法完全理解这方面的语法,或者它是否可能/推荐。

我尝试创建一个单列表变量,然后用我要运行的命令填充每一行。我对如何迭代这个表变量并实际运行命令感到窒息。谷歌搜索已被证明无济于事。

提前感谢您的帮助!

【问题讨论】:

    标签: sql-server sql-server-2005 tsql exec


    【解决方案1】:

    你总是可以使用光标:

    USE Northwind
    
    DECLARE @name VARCHAR(32)
    DECLARE @command VARCHAR(100)
    
    DECLARE shell_cursor CURSOR FOR 
    SELECT LastName FROM Employees
    
    OPEN shell_cursor
    
    FETCH NEXT FROM shell_cursor INTO @name
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @command = 'echo ' + @name
        EXEC master.dbo.xp_cmdshell @command
        FETCH NEXT FROM shell_cursor INTO @name
    END
    
    CLOSE shell_cursor
    DEALLOCATE shell_cursor
    
    GO
    

    【讨论】:

    • 事实上...您总是使用光标。根本没有其他方法可以做到这一点。
    【解决方案2】:

    这是一次性工作吗?如果是这样,你最好从相反的方向来。也就是说,与其编写存储过程来调用 XP_CMDSHELL 来针对表数据运行某些程序,不如考虑编写一个程序直接针对表数据进行操作。如果想到一种脚本产品,那就是 PowerShell。它集成了对 Windows 平台支持的任何数据库的支持,您会在 www.poshcode.org 上找到大量脚本来执行此类操作。

    另一方面,如果这是要安排的事情,我想你的想法没有什么大问题,除了 XP_CMDSHELL 现在被 SQL Server 开箱即用地禁用了。重新启用它会将您的服务器打开一个全新的漏洞利用世界,特别是如果该表数据来自网页表单或其他一些有问题的来源。

    -奥辛

    【讨论】:

    • 很好的建议,但是 1. 在这个特定的例子中,它适用于防火墙后的开发服务器 2. 我对你在一个集合中循环的一般方式感兴趣T-SQL 3 中的 foreach 方式。我不太了解 PowerShell :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多