动态 SQL 从自定义 @Column 获取一个值到结果变量
Dynamic SQL get one value from custom @Column into result variable
我一直在努力实现这一点,但到目前为止我搜索的主题都没有奏效。
我在存储过程中有以下代码:
DECLARE @sql NVARCHAR(500)
DECLARE @qty money
SET @sql = N'SELECT TOP 1 @qty = @QuantityColumnName FROM #TemporaryTable WHERE ID = @Id'
EXEC sp_executesql @sql, N' @QuantityColumnName nvarchar(50),@Id bigint, @qty money OUTPUT', @QuantityColumnName = @QuantityColumnName, @Id = @Id, @qty = @qty OUTPUT;
//this does not execute
@Id 帮助我遍历 #TemporaryTable,@QuantityColumnName 是我的 nvarchar(50) 类型过程的参数。 #TemporaryTable 有 2 列,假设是 Quantity1 和 Quantity2,根据某些逻辑,我将列名传递给此过程并使用此处的值:
UPDATE Stocks
SET Quantity = Quantity - @qty
WHERE blabla
这里
INSERT INTO Stocks(ArticleLotId, LocationId, Quantity, ReservedQuantity)
VALUES (@artLotId, @locId, @qty, 0)
无法评估错误消息“@qty”。
我什至尝试了另一种变体,但也没有成功,我试图将结果存储在 table
中
--Extract and cast result from @QuantityColumnName
DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT ' + @QuantityColumnName + ' FROM #TemporaryTable WHERE ID = @Id'
DECLARE @resultSql AS TABLE(col money)
INSERT INTO @resultSql EXECUTE sp_executesql @sql
并尝试使用这样的结果:
UPDATE Stocks
SET Quantity = Quantity - (SELECT col FROM @resultSQL)
WHERE blabla
你能帮我解释一下我做错了什么吗?
提前致谢!
您不能参数化对象名称,您必须安全地注入值。
这应该是你想要的:
DECLARE @QuantityColumnName sysname = N'ColumnName'; --Correct datatype for object names
DECLARE @sql NVARCHAR(MAX);
DECLARE @qty money;
SET @sql = N'SELECT TOP 1 @qty = ' + QUOTENAME(@QuantityColumnName) + N' FROM #temporaryTable WHERE ID = @Id;'
EXEC sp_executesql @sql, N' ,@Id bigint, @qty money OUTPUT', @Id = @Id, @qty = @qty OUTPUT;
我一直在努力实现这一点,但到目前为止我搜索的主题都没有奏效。 我在存储过程中有以下代码:
DECLARE @sql NVARCHAR(500)
DECLARE @qty money
SET @sql = N'SELECT TOP 1 @qty = @QuantityColumnName FROM #TemporaryTable WHERE ID = @Id'
EXEC sp_executesql @sql, N' @QuantityColumnName nvarchar(50),@Id bigint, @qty money OUTPUT', @QuantityColumnName = @QuantityColumnName, @Id = @Id, @qty = @qty OUTPUT;
//this does not execute
@Id 帮助我遍历 #TemporaryTable,@QuantityColumnName 是我的 nvarchar(50) 类型过程的参数。 #TemporaryTable 有 2 列,假设是 Quantity1 和 Quantity2,根据某些逻辑,我将列名传递给此过程并使用此处的值:
UPDATE Stocks
SET Quantity = Quantity - @qty
WHERE blabla
这里
INSERT INTO Stocks(ArticleLotId, LocationId, Quantity, ReservedQuantity)
VALUES (@artLotId, @locId, @qty, 0)
无法评估错误消息“@qty”。
我什至尝试了另一种变体,但也没有成功,我试图将结果存储在 table
中--Extract and cast result from @QuantityColumnName
DECLARE @sql nvarchar(1000)
SET @sql = 'SELECT ' + @QuantityColumnName + ' FROM #TemporaryTable WHERE ID = @Id'
DECLARE @resultSql AS TABLE(col money)
INSERT INTO @resultSql EXECUTE sp_executesql @sql
并尝试使用这样的结果:
UPDATE Stocks
SET Quantity = Quantity - (SELECT col FROM @resultSQL)
WHERE blabla
你能帮我解释一下我做错了什么吗? 提前致谢!
您不能参数化对象名称,您必须安全地注入值。
这应该是你想要的:
DECLARE @QuantityColumnName sysname = N'ColumnName'; --Correct datatype for object names
DECLARE @sql NVARCHAR(MAX);
DECLARE @qty money;
SET @sql = N'SELECT TOP 1 @qty = ' + QUOTENAME(@QuantityColumnName) + N' FROM #temporaryTable WHERE ID = @Id;'
EXEC sp_executesql @sql, N' ,@Id bigint, @qty money OUTPUT', @Id = @Id, @qty = @qty OUTPUT;