1

テーブルを作成してデータを入力するスクリプトを作成し、アプリがテーブルにアクセスするためのストアド プロシージャを作成しようとしています。ストアド プロシージャに到達するまで、スクリプトは正常に実行されます。.sql ファイルをアプリに読み込んでから、接続を介してこのスクリプトを 1 回の実行で実行しようとしています。スクリプトのこのチャンクから「go」キーワードを削除して、1 回の実行で実行する方法はありますか?

if object_id('GetStudentByID') is not null
drop procedure GetStudentByID;
go
create procedure GetStudentByID
(@StudentID INT)
as
select StudentID,FirstName,LastName
from Student
where StudentID = @StudentID;
4

2 に答える 2

5

このような:

if object_id('GetStudentByID') is not null
    EXEC('drop procedure GetStudentByID;');

EXEC('create procedure GetStudentByID
(@StudentID INT)
as
select StudentID,FirstName,LastName
from Student
where StudentID = @StudentID;');

すぐにはわかりませんが、"GO" はSQL Server コマンドではないため、これは一般的な問題です。むしろ、これは Management Studio (および SQLCMD も同様) によって実装されるコマンドであり、SQL コマンド テキストのストリームを個別のコンパイル可能なバッチに分割する方法を指示できるようにします。

SQL Server 自体にはそのようなコマンドがないため、SQL スクリプトをストアド プロシージャやエージェント ジョブなどに組み込む必要がある場合は、別の方法で処理する必要があります。これを行う SOP の方法は、sp_executeCmd( ...)または EXEC('string') (上記のように)。

于 2012-04-22T19:36:48.733 に答える
0

単一のバッチで CREATE PROCEDURE を実行する必要があります。あなたが何を達成したいのかわかりません。アプリを複数回実行するようにプログラムすることはできないため、単一のコマンドを実行しますか? その場合は、手順ごとにループを設定してみてください(機能しない場合は、ここにコードを投稿してください:))

それらを一緒に実行して、すべてが同時に失敗または成功するようにする場合は、それらをトランザクションでラップします。その後、GO バッチ セパレーターを保持できますが、最後まで待機してすべてをコミットします。

例えば

BEGIN TRANSACTION; 
GO

if object_id('GetStudentByID') is not null
drop procedure GetStudentByID;
go
create procedure GetStudentByID
(@StudentID INT)
as
select StudentID,FirstName,LastName
from Student
where StudentID = @StudentID;
GO
/* replace this line with other procedures */

COMMIT TRANSACTION; 
GO
于 2012-04-22T19:31:16.107 に答える