无法将值从变量传递到另一个变量

时间:2014-07-30 07:40:39

标签: sql variables dynamic

当我想将变量的值传递给另一个变量时,我遇到了问题。

declare @column varchar(255);
set @column = 'cheesecake';

declare @tmp varchar(255);
set @tmp = (select @column from TEST where id = 1);

但在这种情况下,@tmp不具有该表的值,而是@column变量的名称。我用动态sql尝试了它,但是我遇到了语法错误。

declare @column varchar(255);
set @column = 'cheesecake';

declare @tmp varchar(255);
set @tmp = exec('select ' + @column + ' from TEST where id = 1');

如何解决@tmp变量包含查询值?

2 个答案:

答案 0 :(得分:1)

EXEC在不同的上下文中执行,因此无需轻松共享变量。您可以使用sp_executesql

为语句指定输出参数
DECLARE 
  @language nvarchar(255),
  @translation nvarchar(255), 
  @statement nvarchar(255)
SET @language = N'norwegian'
SET @statement = 'select @translation='+@language+' from Translations where id = 1'
EXEC sp_executesql 
  @statement, 
  N'@translation nvarchar(255) OUTPUT', 
  @translation OUTPUT
SELECT @translation

SQLFiddle

答案 1 :(得分:-1)

AFAIK,不能使用`exec直接赋值给变量。解决问题的方法是创建一个表变量来存储动态查询的结果,然后使用表变量设置第二个变量的值,如下所示:

declare @column varchar(255);
set @column = 'cheesecake';

declare @tmp varchar(255); 
declare @query nvarchar(255) = N'select ' + @column + N' from TEST where id = 1'

declare @tbl table(tmp varchar(255)) --Intermediate Table variable

insert into @tbl --Insert dynamic query results here
exec sp_executesql @query

select top 1 @tmp = tmp from @tbl --Assign value here

select @tmp
编辑:我有所纠正。 This答案显示了如何通过在动态查询中使用OUTPUT参数将动态SQL结果分配给变量。