27
DECLARE @script VARCHAR(MAX);
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    go
    create table ali(id decimal(10,0));
    drop table ali;
    '

EXEC (@script);

上記のクエリを実行すると、エラー メッセージが表示されました。これを解決するためのアイデアがあれば教えてください。

メッセージ 102、レベル 15、状態 1、行 4 'go' 付近の構文が正しくありません。

注:作成されたテーブルを作成および削除するための上記のコードは単なる例です.goステートメントを使用した他の動的クエリがあります。この答えを出さないでください。

DECLARE @script   VARCHAR(MAX),
        @script1  VARCHAR(MAX);
SET @script = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    ';
SET @script1 = 
    '
    create table ali(id decimal(10,0));
    drop table ali;
    ';
EXEC (@script);
EXEC (@script1);
4

5 に答える 5

27

GO実際には有効な T-SQLではありません:

GO は Transact-SQL ステートメントではありません。これは、sqlcmd ユーティリティと osql ユーティリティ、および SQL Server Management Studio コード エディターによって認識されるコマンドです。

動的 SQL でのインスタンスを削除するGOか、記事に記載されているツールのいずれかを使用する必要があります (osqlコマンド ラインなどから)。クエリはGO、動的 SQL から削除された のすべてのインスタンスで引き続き機能するはずです。

于 2013-01-23T05:52:56.697 に答える
5

@mellamokbGOで述べられているように、動的 T-SQL クエリでは使用できません。

質問の2番目の部分で述べたように、個別のSQLクエリを実行したくないため、クエリを個別のバッチに分割することで回避できる場合があります。

UDF を使用してクエリを分割GOできます。分割後、分割されたバッチを実行します。

GOしかし、最初に文字列を作成し、しばらくしてから分解するのは自然ではありません。

于 2013-01-23T06:11:15.407 に答える
3

GOはバッチセパレータであり、他の人が指摘しているように、有効なSQLではありません。実際のところ、SSMS-ツール-オプション-クエリ実行-SQL Serverに移動し、バッチセパレータとして使用するCOMEなどの他のテキストを入力できます。

これを行うと、SSMSでもGOが認識されなくなります。動的SQLは、バッチセパレータがなくても実行する必要があります。ここでGOの必要性はわかりません

ラージ

于 2013-01-23T06:30:23.657 に答える