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番目の質問:フィールド名の配列を作成してストアドプロシージャに渡すにはどうすればよいですか?