Динамический SQL получает одно значение из пользовательского @Column в переменную результата - PullRequest
1 голос
/ 21 октября 2019

Я пытался выполнить это, и ничего, что я искал по этой теме, пока не сработало. У меня есть следующий код в хранимой процедуре:

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 помогает мне перебрать #TeoraryTable, а @QuantityColumnName - это параметр для моей процедуры типа nvarchar (50). Таблица #TeoraryTable имеет 2 столбца, скажем, Количество1 и Количество2, и, основываясь на некоторой логике, я передаю имя столбца этой процедуре и использую значение здесь:

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

Не могли бы вы помочь мне и объяснить, что я делаю неправильно? Заранее спасибо!

1 Ответ

2 голосов
/ 21 октября 2019

Вы не можете параметризовать имя объекта, вам нужно безопасно ввести значение.

Это должно быть тем, что вы ищете:

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