2016-09-23 107 views
1

我正在MSSQL中創建存儲過程,並在此存儲過程中聲明一個臨時表(我們稱該表爲@TempTable)並在其中插入一些內容。到現在爲止還挺好。但是在此過程的稍後階段,我需要使用動態sql,因爲過程的一些參數是現有表的列名。 而這個動態SQL語句我需要一個像動態SQL中的臨時表(SQL-Server)

DECLARE @SQLString nvarchar(500) 

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

EXEC (@SQLString) 

但在這種情況下,SQL認爲@TempTable是一個標量以比較真實的表的一些價值觀和@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

您可以簡單地將表聲明爲數據庫中的實際表(暫時),然後在完成時刪除它 – Takarii

+0

您正在使用的SQL Server版本是什麼? – 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列/表名你動態查詢通過。