一旦我想运行下一个查询,我就遇到了问题:
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
?
答案 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
@query
是您的动态T-SQL语句N'@j INT'
是参数声明@j = @j
是参数分配答案 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