【问题标题】:Dynamic SQL get one value from custom @Column into result variable动态 SQL 从自定义 @Column 中获取一个值到结果变量中
【发布时间】:2020-02-17 14:09:22
【问题描述】:

我一直在努力做到这一点,但到目前为止,我在该主题上的搜索都没有奏效。 我在存储过程中有以下代码:

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”。

我什至尝试了另一种变体,但也没有成功,我尝试将结果存储在表格中

--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

您能帮我解释一下我做错了什么吗? 提前谢谢!

【问题讨论】:

    标签: sql sql-server dynamic dynamic-sql sp-executesql


    【解决方案1】:

    您不能对对象名称进行参数化,您必须安全地注入该值。

    应该是你所追求的:

    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;
    

    【讨论】:

    • 很高兴能帮上忙,@ElenaO,我希望以上内容也有意义。
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2020-06-29
    • 2016-03-12
    • 2013-09-27
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多