2017-09-27 11 views
0

私は少し使用されている短いSQLスクリプトを持っています。スクリプト内で一時テーブルを再利用し、うまく動作しています。複数のバッチを含むSQL Serverストアドプロシージャ - 一時テーブルの再利用

最近、私は私が私を待って驚いていましたが、スクリプト全体を2つのバッチに分割するためにキーワードGOを使用しています。どのように私は一時テーブルを再利用することができた) - これは、SQL Serverが私に吠えている理由です。ここで

は、スクリプトの機能を表示するダウン易しく書き直さスクリプトです:

DROP TABLE IF EXISTS #temp; 
SELECT 
    'john' AS first_name 
    ,'doe' AS last_name 
INTO #temp; 

SELECT * FROM #temp 
GO 
TRUNCATE TABLE #temp; 

DROP TABLE #temp; 

SELECT 
    'jane' AS first_name 
    ,'doe' AS last_name 
INTO #temp; 

は、ここで私は失敗したとはいえ、手順で行うことを試みたものです:

CREATE PROCEDURE #temp_proc 
AS 
BEGIN 
    DROP TABLE IF EXISTS #temp; 
    SELECT 
     'john' AS first_name 
     ,'doe' AS last_name 
    INTO #temp; 

    SELECT * FROM #temp 
    GO 
    TRUNCATE TABLE #temp; 

    DROP TABLE #temp; 

    SELECT 
     'jane' AS first_name 
     ,'doe' AS last_name 
    INTO #temp; 
END 

ここで私が取得エラーメッセージがあります手順を作成しようとすると:

メッセージ104、レベル15、状態1、プロシージャ#temp_proc、行10 [バッチ開始行0]
'#temp'付近の構文が正しくありません。

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

目的:私は手順でこのすべてを固執したいと思いますけれども、私は、同じ一時テーブル名を再利用し続けたいと思います。何か案は?

答えて

1

申し訳ありませんがご理解いただけません。これは、アプリケーションによって理解され、実装されるキーワードです。 アプリケーションに対して、先行するすべてのスクリプトテキスト(スクリプトまたは前のGOの冒頭まで)を取り出し、実行のためにdbエンジンに送信することを示します。プロシージャ作成スクリプトは、2つの別々のバッチとして解釈され実行されます(GOがバッチセパレータと呼ばれる理由です)。最初のものは次のとおりです。

CREATE PROCEDURE #temp_proc 
AS 
BEGIN 
DROP TABLE IF EXISTS #temp; 
SELECT 
    'john' AS first_name 
    ,'doe' AS last_name 
INTO #temp; 
SELECT * FROM #temp 
GO 

は続く:

TRUNCATE TABLE #temp; 
DROP TABLE #temp; 
SELECT 
    'jane' AS first_name 
    ,'doe' AS last_name 
INTO #temp; 
END 

そして、これは単にプロシージャを作成していることに気づきます。プロシージャの実行方法とは関係ありません。ここでは何も活用できません。プロシージャの定義や実行を「go」を使ってバッチに分割することはできません。ですから、あなたのアイデアや方向性は、変化なしには不可能です。動的SQLは可能性がありますが、それはあなたに挑戦し課税する複雑さのレベルです。

2

ストアドプロシージャでGOを使用することはできません。それを削除すると、コードが期待どおりに実行されるはずです。後でドロップすると、テーブルを切り捨てる必要はありませんが、

+0

GOコマンドは、次のすべての命令を無視して、(前の)コードをSQL Serverに集約します...(後続の命令は別のコマンドで送信されます) – clementakis

+0

GOはコードの最後に使用できます。 – clementakis

+0

GOはSSMSバッチセパレータです...これは、単一のSSMSタブまたは単一のスクリプトでさまざまなことを行うための便利なツールです。たとえば、1つのファイルから5つの新しいprocsを削除する場合は、各procの定義をGOで区切る必要があります。一方、ストアドプロシージャは、独自のバッチとして実行され、バッチに分割することはできません。手続き定義からそれを単に削除するだけでよいのです。 –

0

コード内のGOを削除する以外に、ストアドプロシージャ内の同じ一時テーブルを削除して再作成することはできません。 SQL Serverはドロップを無視し、2つのSELECT INTOステートメントに同じ#テーブルを作成しようとします。

+0

お返事いただきありがとうございます。同じテーブル名を再利用することの制限は、SPに限らず、同じバッチ内のどのコードでも可能です。したがって、私は 'GO'キーワードを導入しました。 – Eli

関連する問題