0

2つの別々のストアドプロシージャで#tempテーブルを使用しています。ある場合には、それは正常に動作していますが、他の場合には、エラー「無効なオブジェクト名#temp」が発生します。

最初のケース:

SELECT SubsID,
       SubsName,
       AbbrName
INTO   #TEMP
FROM   SubsList
WHERE  CAST (SubsID AS VARCHAR(10)) LIKE '%' + @intRight + '%'
        OR SubsName LIKE '%' + @intRight + '%'

  正常に動作しています。

このSQLをより動的にするために、QUOTENAMEを使用し、次の変更を行いました。1.sysnameとして@ColName、@ sourceName、@ intField、および@txtFieldのデータ型を作成しました。2.実際、SQLの選択と削除でエラーが発生したため、param @tableNameをsysnameとして削除しました(値:#tempが渡されました)。3.@ColNameで1つのフィールド名を渡します。3つのフィールド名をすべて渡すと、エラーが発生しました。4. @cmd nvarchar(max)を宣言し、実行のためにSQLを割り当てました。

SET @cmd = N'Select ' + QUOTENAME(@ColName) + 
           N' INTO #temp from ' + QUOTENAME(@sourceName) + 
           N' where CAST(' + QUOTENAME(@intField) + N' AS VARCHAR(10)) like ''%' + @strVal + 
           N'%'' or ' + QUOTENAME(@txtField) + ' like ''%' + @strVal + N'%''' --working
EXEC sp_executesql @cmd;

SELECT *
FROM   #temp;

DROP TABLE #temp;

EXEC sp_executesql @cmdをEXEC(@cmd)に変更しましたが、エラーが残りました。

無効なオブジェクト名のエラーが発生しますが、#tempを## tempに変更すると、このエラーは発生しません。

私の最初の質問:#tempを使用する場合、このエラーの理由は何でしょうか?2番目の質問:フィールド名の配列を作成してストアドプロシージャに渡すにはどうすればよいですか?

4

1 に答える 1

2

execが実行された後、一時テーブルはスコープ外になります。「exec」または「sp_executesql」は独自のスコープで実行されます。したがって、一時テーブルや変数のように作成されたものはすべて、実行が終了するとすぐに破棄されるか、スコープ外になります。これらはストアドプロシージャのように考えてください。

この問題を修正するには、メインコードで一時テーブルを作成します。次に、動的SQLを使用して一時テーブルに挿入し、メインコードで読み取ります。

于 2012-07-16T14:27:44.987 に答える