2

テーブル内の行ごとに 1 回 (EXEC master..xp_cmdshell 経由で) 実行したい単一の Windows シェル コマンドがあります。コマンド出力を作成するために、さまざまなフィールドからの情報を使用しています。

私は、(個々のクエリとは対照的に) T-SQL プログラムを作成することに慣れていないため、この構文について、またはそれが可能/推奨されているかどうかについて、頭を悩ませることができません。

単一の列テーブル変数を作成してから、実行するコマンドを各行に入力してみました。このテーブル変数を反復処理して、実際にコマンドを実行する方法がわかりません。グーグルで検索しても役に立たないことが証明されています。

助けてくれてありがとう!

4

2 に答える 2

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
于 2008-12-24T00:33:41.017 に答える
2

これは一度限りの仕事ですか?もしそうなら、逆方向から来たほうがいいかもしれません。つまり、XP_CMDSHELL を呼び出してテーブル データに対して何らかのプログラムを実行するストアド プロシージャを記述する代わりに、テーブル データに対して直接動作するプログラムを記述することを検討する必要があります。1 つのスクリプト製品が頭に浮かぶとしたら、それは PowerShell です。Windows プラットフォームがサポートするすべてのデータベースのサポートが統合されており、www.poshcode.org でそのようなことを行うスクリプトが大量に見つかります。

一方、これがスケジュールされているものである場合、XP_CMDSHELL が最近の SQL Server ですぐに無効になっているという事実を除けば、あなたの考えに大きな問題はないと思います。再度有効にすると、サーバーがまったく新しいエクスプロイトの世界に開かれます。特に、そのテーブル データが Web ページ フォームまたはその他の疑わしいソースから供給されている場合はなおさらです。

-オイシン

于 2008-12-24T00:36:11.667 に答える