2014-10-09 3 views
0

У меня есть столбец типа * NVARCHAR, который содержит фрагменты инструкций SQL вместо окончательных значений. Так, например, один из полей имеет следующий фрагмент кода:Преобразование строки инструкции tSQL в конечное значение

CAST(@originalValue * -1 AS INT) 

То, что я пытаюсь сделать, чтобы использовать эти фрагменты SQL для вставки в хранимой процедуре кода последнего на. Чтобы проверить функциональность, я создал следующий очень простой пример, чтобы установить целочисленное значение (5) и использовать приведенный выше фрагмент SQL в динамическом выражении SQL для инвертирования этого значения (5) в (-5).

DECLARE @originalValue AS INT = 5 
DECLARE @fianalValue AS INT 
DECLARE @sql AS NVARCHAR(50) 
DECLARE @value AS NVARCHAR(50) = 'CAST(@originalValue * -1 AS INT)' 

SET @sql = 'SELECT @fianalValue = '+CAST(@value AS NVARCHAR(100))+'' 

exec sp_executesql @sql, N'@fianalValue INT OUTPUT', @fianalValue = @fianalValue OUTPUT 

PRINT '@fianalValue: ' + CAST(@fianalValue AS VARCHAR(50)) 

Однако, я получаю сообщение об ошибке. Я пробовал несколько разных подходов, но что-то не выстраивается. Спасибо за помощь.

+1

Какая ошибка? У вас подозрительная звезда в вашем значении '@ value'. –

+0

Ошибка: Msg 137, Level 15, State 2, Line 1 Должен объявить скалярную переменную «@originalValue», а подозрительная звезда - математический оператор - Умножение :) – Milan

+1

Doh! Интересно, как я мог неправильно понять это как ошибку :) Вам нужен список параметров. Однако я забываю, как это сделать. Google для примера. –

ответ

0
Try this 

DECLARE @originalValue AS INT = 5 
    DECLARE @fianalValue AS INT 
    DECLARE @sql AS NVARCHAR(50) 
    DECLARE @value AS NVARCHAR(50) = 'CAST('+convert(varchar(20),@originalValue)+' * -1 AS INT)' 


    SET @sql = 'SELECT @fianalValue = '+CAST(@value AS NVARCHAR(100))+'' 

    exec sp_executesql @sql, N'@fianalValue INT OUTPUT', @fianalValue = @fianalValue OUTPUT 

    PRINT '@fianalValue: ' + CAST(@fianalValue AS VARCHAR(50)) 
+0

... ну, я я не уверен, как это будет вести себя при некоторых больших обновлениях набора данных, но это работает. Спасибо! – Milan

+0

... жаль, что я не дошел до этого раньше. Проблема с вашим решением заключается в том, что объявление @value разрешается во время самого объявления, поэтому оно никогда не превратится в динамический SQL как «строку». Вместо этого он будет предоставлен как ранее разрешенное значение, которое не имеет значения. Спасибо. – Milan

Смежные вопросы