2014-10-09 64 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'值有一個可疑的星星。 – 2014-10-09 22:24:53

+0

錯誤是:消息137,級別15,狀態2,行1 必須聲明標量變量「@originalValue」和可疑星是數學運算符 - 乘法:) – Milan 2014-10-09 22:39:27

+1

Doh!不知道我怎麼會誤解爲一個錯誤:)你需要一個參數列表定義。不過,我忘了該怎麼做。谷歌爲例。 – 2014-10-09 22:41:43

回答

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 2014-10-10 17:21:40

+0

...對不起,我沒有得到這一點。解決方案的問題在於@value聲明在聲明本身時解析,因此它永遠不會將其作爲「字符串」進入動態SQL。相反,它將以先前解決的值提供,這是缺少重點的。謝謝。 – Milan 2014-10-30 17:14:04