2016-09-23 77 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列/表名你动态查询通过。