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

时间:2018-07-18 08:00:32

标签: sql-server

我想知道,如何在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语句的一部分。

详细说明。使用此代码,我收到了这些数据

enter image description here

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

因此,SQL查询应如下所示:

select T1 from ProductProperty

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

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

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

select 'T1' from ProductProperty

请问,我在做什么错?如果您需要其他信息,请告诉我。

编辑:

完成查询以进一步说明

1 个答案:

答案 0 :(得分:1)

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

SELECT @colname;

您需要做的是将@colname变量的值输出到要传递给sp_executesql的SQL字符串中。只要用户未输入@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