Sql 动态查询中的变量
我想运行下一个查询时遇到问题:Sql 动态查询中的变量,sql,sql-server,variables,dynamic,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)) inser
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;
问题是,如果我在@query
变量的声明中将变量@j
更改为一个数值,如下所示
declare @query nvarchar(255) = N'select ' + @column + N' from TEST where id = 1'
declare @query nvarchar(255) = N'select ' + @column + N' from TEST where id = @j'
如果我将@j
变量留在那里,则查询正在成功运行,如下所示
declare @query nvarchar(255) = N'select ' + @column + N' from TEST where id = 1'
declare @query nvarchar(255) = N'select ' + @column + N' from TEST where id = @j'
我收到一条错误消息:
“必须声明标量变量@j
”
为什么??我如何解决我的查询将使用变量
@j
?代替==,其中id=@j'
像这样改变可能会奏效
转换(nvarchar(2),@j) 您需要将
@j
变量转换为字符串。由于它的类型是,您应该将其转换为
CAST(@j AS VARCHAR(12))
另外,当使用sp\u 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;
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;
在以下行中:
exec sp_executesql@query,N'@j INT',@j=@j
@query
是您的动态T-SQL语句N'@j INT'
是参数声明@j=@j
是参数分配您可以在sp_executesql语句中使用如下参数:
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;
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;
声明@j int=1
声明@column varchar(255);
set@column='last_name'
声明@tmp varchar(255);
声明@query nvarchar(255)=N'从测试中选择'+@column+N',其中id='+CAST(@j作为VARCHAR(5))
声明@tbl表(tmp varchar(255))
插入@tbl
exec(@query)
从@tbl中选择top 1@tmp=tmp
选择@tmp
从@tbl中选择*
enter code here
为什么在连接中存在不一致性-@列连接时没有引号,@j在引号内?