在SQL Server中的Dynamic Select中设置先前声明的变量的值

时间:2015-12-14 21:55:40

标签: sql-server dynamic

我正在使用下面发布的一段动态SQL。

在我打印@Query并运行它的测试期间,我的变量被分配。但是当添加了额外的间接级别,并且使用Exec运行@Query时,最后的Select语句将返回null。

DECLARE @ETFirstPart varchar(max)
DECLARE @ETContactLines varchar(max)
DECLARE @ETAlternateContactOnlyLine varchar(max)
DECLARE @ETLastPart varchar(max)

SET @Query = N'SELECT @ETFirstPart = piv.HBAppCli1, @ETContactLines = piv.HBAppCli2a, @ETAlternateContactOnlyLine = piv.HBAppCli2b, @ETLastPart = piv.HBAppCli3
                from (select EmailMessageType, EmailBody
                        FROM ' + @dbSharedServer + '.dbShared.dbo.EmailMessage e
                    ) ac
                pivot (max(EmailBody)
                        for EmailMessageType in (HBAppCli1, HBAppCli2a, HBAppCli2b, HBAppCli3)
                    ) piv'
PRINT @Query
EXEC (@Query)

SELECT @ETFirstPart, @ETContactLines, @ETAlternateContactOnlyLine, @ETLastPart

如何在动态选择中获取分配给所选值的变量?

1 个答案:

答案 0 :(得分:1)

您需要使用sp_executesql。如下所示:

DECLARE @sql nvarchar(max)

set @sql = N'SELECT @ETFirstPart = piv.HBAppCli1, @ETContactLines = piv.HBAppCli2a, @ETAlternateContactOnlyLine = piv.HBAppCli2b, @ETLastPart = piv.HBAppCli3
            from (select EmailMessageType, EmailBody
                    FROM ' + @dbSharedServer + '.dbShared.dbo.EmailMessage e
                ) ac
            pivot (max(EmailBody)
                    for EmailMessageType in (HBAppCli1, HBAppCli2a, HBAppCli2b, HBAppCli3)
                ) piv'

 exec sp_executesql @sql, N'@ETFirstPart varchar(max) out, @ETContactLines varchar(max) out, @ETAlternateContactOnlyLine varchar(max) out, @ETLastPart varchar(max) out', @ETFirstPart out, @ETContactLines out, @ETAlternateContactOnlyLine out, @ETLastPart out
SELECT @ETFirstPart, @ETContactLines, @ETAlternateContactOnlyLine, @ETLastPart