可以在一组数据上使用EXEC master..xp_cmdshell吗?

时间:2008-12-24 00:00:23

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

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

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

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

您可以随时使用光标:

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

答案 1 :(得分:2)

这是一次性的工作吗?如果是这样,你可能最好从反方向来。也就是说,不应该编写存储过程来调用XP_CMDSHELL来对表数据运行某些程序,而应该考虑编写一个程序来直接处理表数据。如果想到一个脚本产品,那就是PowerShell。它集成了对windows平台支持的任何数据库的支持,你可以在www.poshcode.org上找到大量的脚本来做这种事情。

另一方面,如果这是要安排的事情,我想你的想法并没有什么大不了的,除了XP_CMDSHELL这些天开箱即用于SQL Server的事实。重新启用它会将服务器打开到一个全新的漏洞世界,特别是如果该表数据来自网页表单或其他一些可疑来源。

-Oisin