Можно ли использовать EXEC master..xp_cmdshell для набора данных? - PullRequest
1 голос
/ 24 декабря 2008

У меня есть одна команда оболочки Windows, которую я хотел бы выполнить (через EXEC master..xp_cmdshell) один раз для каждой строки в таблице. Я использую информацию из различных полей для создания вывода команды.

Я относительный новичок в написании программ на T-SQL (в отличие от отдельных запросов) и не могу полностью разобраться в синтаксисе этого или, если это вообще возможно / рекомендуется

Я попытался создать переменную таблицы из одного столбца, а затем заполнить каждую строку командой, которую хочу запустить. Я задушен тем, как перебирать эту табличную переменную и фактически запускать команды. Поиск в интернете оказался бесполезным.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

5 голосов
/ 24 декабря 2008

Вы всегда можете использовать курсор:

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 голосов
/ 24 декабря 2008

Это разовая работа? Если это так, то вам может быть лучше, если вы пойдете в обратном направлении. Другими словами, вместо написания хранимой процедуры для вызова XP_CMDSHELL для запуска какой-либо программы с данными таблицы, вам следует подумать о написании программы, которая будет работать непосредственно с данными таблицы. Если на ум приходит один скриптовый продукт, это PowerShell. Он имеет встроенную поддержку для любой базы данных, поддерживаемой платформой Windows, и вы найдете множество скриптов на сайте www.poshcode.org для таких целей.

С другой стороны, если это что-то, что должно быть запланировано, я думаю, что в вашей идее нет ничего страшного, кроме того факта, что XP_CMDSHELL отключен из коробки с SQL Server в наши дни. Повторное включение - это открытие вашего сервера для целого нового мира эксплойтов, особенно если эти данные таблицы получены из формы веб-страницы или другого сомнительного источника.

-Oisin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...