2016-09-23 15 views
1

MSSQLでストアドプロシージャを作成していますが、このストアドプロシージャ内にテンポラリテーブル(このテーブルを@TempTableとしましょう)を挿入し、その中にいくつかのものを挿入します。ここまでは順調ですね。しかし、このプロシージャの後の時点で、動的SQLを使用する必要があります。これは、プロシージャのいくつかのパラメータが既存の表の列名であるためです。 そして、この動的SQL文の中で、私は実際のテーブルのいくつかの値と@TempTable動的SQL内のテンポラリテーブル

を比較する必要があるので、文は

DECLARE @SQLString nvarchar(500) 

SET @SQLString = N'SELECT A.ColumnA FROM RealTable A, ' + @TempTable + ' B 
WHERE A.' + @ColumnParameter + ' = B.ColumnA' 

EXEC (@SQLString) 

のように見えますが、この場合には、SQLは、@TempTableがスカラー変数であると考えていますそれを宣言する必要があります。また、私はこのようにそれを試してみました:

DECLARE @SQLString nvarchar(500) 

SET @SQLString = N'SELECT A.ColumnA FROM RealTable A, @TempTable B 
WHERE A.' + @ColumnParameter + ' = B.ColumnA' 

EXEC (@SQLString) 

はしかし、この場合はもちろん、それはこれがテーブルであることを、知っていないため、宣言する必要があり@TempTableテーブル変数は、私はこの外に(以前に宣言しましたステートメント)。だから、私の質問は、どうやって動的SQL内のテンポラリテーブルを正しく使用するのですか?

+1

あなたは、単にあなたが使用しているSQL Serverのどのバージョンの – Takarii

+0

とその完成したら、それをドロップし、(一時的に)データベースに実際のテーブルとしてテーブルを宣言するだろうか? – gofr1

+0

SQL Server 2008 R2 – Echelon

答えて

0

宣言@TempTable inseide動的問合せ

DECLARE @SQLString nvarchar(500) 

SET @SQLString = N'DECLARE @TempTable AS TABLE(
    Id INT, 
    ColumnA VARCHAR(50) 
) 
SELECT 
    A.ColumnA 
FROM RealTable A 
INNER JOIN @TempTable B ON A.' + @ColumnParameter + ' = B.ColumnA' 

EXEC (@SQLString) 
+1

私はそれについても考えましたが、それはまた、私は、この一時テーブルにいくつかの値を挿入している場所、ダイナミックSQL(またはそれに間違っていますか?これを避け、動的SQLをできるだけ短く、シンプルに保つことが大切です。 – Echelon

0

あなたは一時テーブルを使用することができます。

USE tempdb 
IF OBJECT_ID(N'#temp') IS NOT NULL DROP TABLE #temp 

USE YourDB 

SELECT SomeColumns 
INTO #temp 
FROM SomeTables 

DECLARE @SQLString nvarchar(500) 


SET @SQLString = N' 
SELECT A.ColumnA 
FROM RealTable A 
INNER JOIN #temp B 
    ON A.' + QUOTENAME(@ColumnParameter) + ' = B.ColumnA' 

EXEC sp_executesql @SQLString 

それはあなたがテーブル変数の限界を乗り越えることができる方法のサンプルです。

ほとんどのノート:

  • 使用sp_executesql

  • 使用QUOTENAMEあなたは、動的クエリに渡す列/テーブル名のため。

関連する問題