动态SQL中的临时表(SQL-Server)

时间:2016-09-23 12:47:07

标签: sql-server

我正在MSSQL中创建一个存储过程,在这个存储过程中,我正在声明一个临时表(让我们调用这个表@TempTable)并在其中插入一些东西。到现在为止还挺好。但是在此过程的稍后阶段,我需要使用动态sql,因为该过程的一些参数是现有表的列名。 在这个动态的sql语句中,我需要比较真实表和@TempTable

的一些值

所以语句看起来像是

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中正确使用临时表?

2 个答案:

答案 0 :(得分:0)

声明@TempTable内容动态查询

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 :(得分: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