我正在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中正确使用临时表?
答案 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
。