代码之家  ›  专栏  ›  技术社区  ›  Mr.J

如何在SQL语句中包含变量数据

  •  0
  • Mr.J  · 技术社区  · 6 年前

    我想知道,如何将变量作为SQL语句的一部分,为了更清楚地说明我的问题,下面是代码

    declare@partno as nvarchar(20)
    声明@ppfno为nvarchar(20)
    声明@dimension为nvarchar(30)
    声明@cursor cursor
    声明@colname为nvarchar(30)
    将@top声明为整数
    将@query声明为nvarchar(max)
    声明@categoryid nvarchar(max)
    
    设置@cursor=光标
    (从sys.columns中选择[name],其中object_id=(从sys.tables中选择object_id,其中name='productproperty')和[name]如't%'和[name]<gt;'temp')按[name]asc排序
    
    打开@光标
    
    获取下一个
    
    从@cursor到@colname
    当@@获取状态=0时
    开始
    --设置@query=(从productproperty中选择@colname,其中partno=@partno和ppfno=@ppfno)
    
    --设置@query='select distinct'+@colname+'from productproperty,其中partno='''+@partno+'''和ppfno=''+@ppfno+'''和dname=''+@dimension+'''
    
    开始
    
    exec sp_executesql n'set@categoryid=(从productproperty中选择distinct@colname,其中partno=@partno和ppfno=@ppfno和dname=@dimension),
    n'@colname nvarchar(30),@partno nvarchar(20),@ppfno nvarchar(20),@dimension nvarchar(30),@categoryid nvarchar(max)output',@colname,@partno,@ppfno,@dimension,@categoryid output
    
    选择@categoryid、@colname、@partno
    
    结束
    -结束
    
    获取下一个
    
    从@cursor到@colname
    结束
    
    关闭@光标
    释放@cursor
    

    请注意,我没有包括变量类型。我只想知道怎样才能成为SQL语句的一部分。

    详细说明。使用此代码,我将接收此数据

    其中,T1是表名。我想创建一个查询,在该查询中,我可以将表名传递到变量中,然后检索该查询的内容。

    所以SQL查询应该如下所示:

    从productproperty选择T1

    但是我没有收到查询,而是收到变量数据,这在上面的屏幕截图中。

    问题是,如果您可能在我的代码中注意到,我将变量@categoryid作为输出参数。这是为了检查查询的内容。

    似乎我正在生成一个如下所示的查询

    从productproperty中选择“T1”

    我能问一下,我做错了什么吗?如果你想要更多的信息,请告诉我。

    编辑:

    已完成查询以获得更多澄清

    请注意,我没有包括变量类型。我只想知道怎么能@colname成为SQL语句的一部分。

    详细说明。使用此代码,我将接收此数据

    enter image description here

    在哪里?T1是表名。我想创建一个查询,在这里我可以将表名传递到变量中,然后检索该查询的内容。

    所以SQL查询应该如下所示:

    select T1 from ProductProperty

    但是我没有收到查询,而是收到变量数据,这在上面的屏幕截图中。

    问题是,如果您在我的代码中注意到,我有一个变量@categoryid作为输出参数。这是为了检查查询的内容。

    似乎我正在生成一个如下所示的查询

    select 'T1' from ProductProperty

    我能问一下,我做错了什么吗?如果你想要更多的信息,请告诉我。

    编辑:

    已完成查询以获得更多澄清

    1 回复  |  直到 6 年前
        1
  •  1
  •   Diado Jasim Juwel    6 年前

    这里的问题是您要它选择 @colname 变量本身作为查询中的第一个值, 存储在变量中的列名的值。这相当于做:

    SELECT @colname;
    

    您需要做的是输出 @列名 变量转换为要传递给的SQL字符串 sp_executesql . 只要 @列名 变量不是由用户输入的,您可以将其连接到传递给 sp_执行sql ,如下:

    DECLARE @SqlQuery NVARCHAR(MAX);
    
    SET @SqlQuery = N'set @categoryid = (select distinct ' + @colname + ' from ProductProperty 
    where PartNo = @PartNo  and PPFNo = @PPFno and DName = @Dimension)';
    
    EXEC sp_executesql @SqlQuery, 
    @PartNo nvarchar(20), @PPFno nvarchar(20),@Dimension 
    nvarchar(30), @categoryid NVARCHAR(MAX) OUTPUT', @PartNo, @PPFno,@Dimension, 
    @categoryid OUTPUT
    
    select @categoryid, @colname, @PartNo
    

    这将有效地为您提供:

    EXEC sp_executesql N'set @categoryid = (select distinct T1 from ProductProperty 
    where PartNo = @PartNo  and PPFNo = @PPFno and DName = @Dimension)', 
    @PartNo nvarchar(20), @PPFno nvarchar(20),@Dimension 
    nvarchar(30), @categoryid NVARCHAR(MAX) OUTPUT', @PartNo, @PPFno,@Dimension, 
    @categoryid OUTPUT