2011-08-04 17 views
3

2005年の互換性設定のSQL 2008ボックスで本番環境で実行されたSSISパッケージがあります。パッケージにはSQLタスクが含まれており、スクリプトの最後にあるSQLが実行されなかったかのように表示されます。そのパッケージに取り組みましたT-SQLスクリプトで "GO"を使用するか使用しないと結果に影響がありますか?

人は、個々のSQL間の「たGO」必要なパッケージには、問題を修正するためのコマンドという会社を離れる前に指摘しました。しかし、SQL Server 2008と2008の互換性のある開発環境でテストを行ったところ、パッケージは正常に動作しました。

私が知っているから、GOのplaceコマンドはバッチで実行されます。コマンドは効率的にデータベースプロバイダにバッチで送られます。私は、GOがその結果に影響を与える唯一の方法は、そのスクリプトのどこかにエラーがあった場合だと考えています。その場合、私はGOを想像することができ、その場合にのみ結果が得られます。しかし、ログに記録されたエラーの証拠は見られませんでした。

は、誰かがGOがさえそうな問題に関連しているかどうか私にはお勧めできますか?エラーが発生しなかったと仮定して、 "GO"コマンドを理解すると、その使用または使用の不足が問題に無関係である可能性が高いことが示唆されます。

答えて

6

GOキーワードは、SQL Serverの管理ツールによって使用されたバッチ区切りです。ただし、キーワード自体がクライアントによって解析されていることに注意することが重要です。ではなく、サーバーがです。

問題のSQL Serverのバージョンによっては、データベースの作成や使用など、別のバッチに配置する必要があります。 (useステートメントのような)バッチの始めに行わなければならない操作もあるので、これらのキーワードを使用すると、スクリプトをバッチに分割する必要があります。

複数のバッチにスクリプトを壊すについて心に留めておくために物事のカップル:

  • エラーがバッチ、そのバッチストップの実行中に遭遇しています。ただし、スクリプトに複数のバッチが含まれている場合、1つのバッチのエラーは停止するだけですバッチは実行されません。その後のバッチはまだ
  • バッチ内で宣言した変数だけがバッチに利用可能なを実行します。他のバッチでは使用できません。

スクリプトでCRUD操作以外の操作を行っている場合は、上記の動作上の違いがない限り、複数のバッチに分割する必要はありません。

+0

いつから 'BEGIN TRANSACTION'はいつバッチに広がっていないのですか?私のために働くと思われる。 –

+0

@Aaron:D'oh!私は今朝、複数のバッチにまたがるトランザクションを使用したスクリプトを書いたので、なぜ私がそれを書いたのか分からない。削除されました。 Mea culpa。 –

2

あなたの仮定のすべてが正しいです。

私が経験したことの1つは、別のバッチの前提条件である文のバッチがある場合は、GOでそれらを区切る必要があるかもしれないということです。 1つの例としては、テーブルに列を追加してその列を更新するとします(私はそう思います...)。しかし、一連のDMLクエリの場合は、GOが存在しないか存在していても問題ありません。

2

私は、スクリプト内の任意の変数を設定した場合、彼らは再利用できませんので、それらの状態(そしておそらく変数自体は)「GO」文の後に拭いていることに気付きました。これは確かにSQL Server 2000のケースでしたが、私は2005年と2008年のケースもそうであると推測しています。あなたが言うよう

+0

はい。 T-SQL変数は単一のバッチに属します。 'GO'で区切られた複数のバッチでそれらを使用することはできません。 –

2

はい、GOが結果に影響する可能性があります。

GO文の間にエラーがあると実行を続行できます。例えば、これらの2つのスクリプトの出力比較:

SELECT * FROM table_does_not_exist; 
SELECT * FROM sys.objects; 

を...

SELECT * FROM table_does_not_exist; 
GO 
SELECT * FROM sys.objects; 

他の人が識別されるように、あなたはあなたがそれらに取り組む前に、あなたが適用された変更が必要な場合GOを発行する必要があるかもしれません(たとえば、新しい列)。GO ...

最後に、GOはT-SQLキーワードではなく、バッチセパレータです。これは、例えばGOをストアドプロシージャの途中に置くことができない理由です。たとえば、SQL Server自体は何を意味するのですか。GO

EDITしかし1つの答えは、トランザクションが、私はに反対バッチを、またがることはできません次のように述べている。

CREATE TABLE #foo(id INT); 
GO 
BEGIN TRANSACTION; 
GO 
INSERT #foo(id) SELECT 1; 
GO 
SELECT @@TRANCOUNT; -- 1 
GO 
COMMIT TRANSACTION; 
GO 
DROP TABLE #foo; 
GO 
SELECT @@TRANCOUNT; -- 0 
関連する問題