sql-server - 如何将变量数据包含到 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
请问,我做错了什么?如果您想了解更多信息,请告诉我。
编辑:
完成查询以获得更多说明
解决方案
这里的问题是您告诉它选择@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
推荐阅读
- swift - 将物理实体分配给自定义精灵节点类中的多个对象
- r - 如何稍微改变 R markdown 中的绘图位置
- python - 如何合并具有来自多列的重复值的行
- node.js - 如何在节点js中连接mongodb?
- java - no.petroware.logio.las.LasFileReader 的依赖是什么?
- angular - Angular项目中的this.notification.Success错误
- c# - Call Constructor of Parent Class and get return value
- c# - ModelState error: The value 'null' is not valid for nullable field
- hibernate - psql 中 ANY 运算符的等效 JPA 查询
- linux - 无法使用 ssh 在 sh 文件上调用带有变量的命令