Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 动态查询中的变量_Sql_Sql Server_Variables_Dynamic - Fatal编程技术网

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在引号内?