动态查询中的变量

时间:2014-07-30 09:24:27

标签: sql sql-server variables dynamic

一旦我想运行下一个查询,我就遇到了问题:

declare @j int = 1;

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

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

declare @tbl table(tmp varchar(255)) 

insert into @tbl 
exec sp_executesql @query

select top 1 @tmp = tmp from @tbl 

select @tmp

select * from @tbl;

问题在于,如果我将变量@j更改为@query变量声明中的数值,就像这样

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

如果我在那里留下了@j变量,那么查询就会成功运行,就像这个

一样
declare @query nvarchar(255) = N'select ' + @column + N' from TEST where id = @j'

我收到错误消息:

“必须声明标量变量@j。”

为什么呢?如何解决我的查询可以使用变量@j

4 个答案:

答案 0 :(得分:2)

取代==== where id = @j'

这样改变可能有效

转换(nvarchar(2),@ j);

答案 1 :(得分:0)

您需要将@j变量强制转换为字符串。如果它的类型为INT,则应将其转换为

CAST(@j AS VARCHAR(12)) 

此外,您可以使用sp_executesql将参数传递给动态SQL语句。在你的情况下,它将是这样的:

declare @j int = 1;

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

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

declare @tbl table(tmp varchar(255)) 

insert into @tbl 
exec sp_executesql @query, N'@j INT', @j = @j

select top 1 @tmp = tmp from @tbl 

select @tmp

select * from @tbl;

在以下行中:

exec sp_executesql @query,N'@ j INT',@ j = @j

  1. @query是您的动态T-SQL语句
  2. N'@j INT'是参数声明
  3. @j = @j是参数分配
  4. sp_executsql documentation

答案 2 :(得分:0)

您可以在sp_executesql语句中使用参数,如下所示:

CREATE TABLE TempTable (
    TempID INT IDENTITY(1,1) NOT NULL,
    SomeDescription VARCHAR(255) NOT NULL,
    PRIMARY KEY(TempID))

INSERT INTO TempTable (SomeDescription) 
VALUES ('Description 1'),
    ('Description 2'),
    ('Description 3')

DECLARE @sql NVARCHAR(500) = 'SELECT * FROM TempTable WHERE TempID = @TempVar',
        @params NVARCHAR(500) = '@TempVar int',
        @j INT = 2;

EXEC sp_executesql @sql, @params, @TempVar = @j;

答案 3 :(得分:0)

声明@j int = 1;

声明@column varchar(255); 设置@column ='last_name';

声明@tmp varchar(255); 声明@query nvarchar(255)= N从TEST中选择'+ @column + N',其中id ='+ CAST(@j AS VARCHAR(5))

声明@tbl表(tmp varchar(255))

插入@tbl exec(@query)

从@tbl

中选择前1名@tmp = tmp

选择@tmp

从@tbl中选择*;

enter code here