首页 > 解决方案 > 如何将变量数据包含到 SQL 语句中

问题描述

我想知道,如何将变量包含在 SQL 语句中,以澄清我的问题,这里是代码

declare @PartNo as nvarchar(20)
declare @PPFno as nvarchar(20)
declare @Dimension as nvarchar(30)
declare @cursor CURSOR
declare @colname as nvarchar(30)
declare @top as integer
declare @query as nvarchar(MAX)
declare @categoryid NVARCHAR(MAX) 

set @cursor = CURSOR FOR 
    (select [Name] from sys.columns where object_id = (select object_id from sys.tables where name = 'ProductProperty') and [Name] like 'T%' and [name] <> 'TEMP')order by [Name] asc

    OPEN @cursor

    FETCH NEXT

    FROM @cursor INTO @colname
    WHILE @@FETCH_STATUS = 0
    BEGIN
        --set @query =  (select @colname from ProductProperty where PartNo = @PartNo  and PPFNo = @PPFno )

        --set @query = 'select distinct '+@colname+' from ProductProperty where PartNo = '''+@PartNo+'''  and PPFNo = '''+@PPFno+''' and DName = '''+@Dimension+''''

BEGIN

EXEC sp_executesql N'set @categoryid = (select distinct @colname from ProductProperty where PartNo = @PartNo  and PPFNo = @PPFno and 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

select @categoryid,@colname ,@PartNo

END
    --end

    FETCH NEXT

    FROM @cursor INTO @colName
    END

    CLOSE @cursor
    DEALLOCATE @cursor

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

进一步阐述。使用此代码,我收到此数据

在此处输入图像描述

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

所以 SQL 查询应该是这样的:

select T1 from ProductProperty

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

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

好像我正在生成一个看起来像这样的查询

select 'T1' from ProductProperty

请问,我做错了什么?如果您想了解更多信息,请告诉我。

编辑:

完成查询以获得更多说明

标签: sql-server

解决方案


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

SELECT @colname;

您需要做的是将@colname变量的值输出到您传递给的 SQL 字符串中sp_executesql。只要@colname变量不是由用户输入的,您就可以将其连接到传递给的字符串中sp_executesql,如下所示:

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

推荐阅读