2012-08-10 179 views
1

我堅持以下SQL Server上:轉換失敗

DECLARE @sql AS NVARCHAR(500),@db as varchar(50),@value AS CHAR(129); 
SET @db = 'SSCT1'; 
SET @value = '1806-11-801-1000'; 
SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
    + '.[dbo].[GL00105] WHERE ACTNUMST = ' + @value; 
EXEC (@sql); 

當我在SQL Server中運行此我得到:轉換爲varchar值「時 轉換失敗1806- 11-801-1000

我檢查了場我使用的where子句反對,它在聲明的類型是否匹配(CHAR(129),所以我不知道它是試圖轉換。

我試圖建立一個SQL語句,將接受db na我作爲一個變量,除了價值。有什麼想法嗎?

感謝

回答

3

我要去猜測ACTNUMST是字符串列,在這種情況下,你需要正確界定它:

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
    + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
    + @value + ''';'; 

如果@value可能永遠包含撇,你需要處理還有:

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) 
    + '.[dbo].[GL00105] WHERE ACTNUMST = ''' 
    + REPLACE(@value, '''', '''''') + ''';'; 

Yuck。一個更安全的方法是:

DECLARE 
    @sql NVARCHAR(MAX), 
    @db SYSNAME, 
    @value CHAR(129); 

SELECT 
    @db = N'SSCT1', 
    @value = '1806-11-801-1000'; 

SET @sql = N'SELECT ACTINDX FROM ' + quotename(@db) 
    + '.[dbo].[GL00105] WHERE ACTNUMST = @val;'; 

EXEC sp_executesql @sql, N'@val CHAR(129)', @value; 

這防範動態SQL更好一點,也可以防止你不得不處理報價。

+0

完美!我想它只是需要額外的引號並結束? – apd23 2012-08-10 19:33:00

+0

@ apd23是的,如果它是一個字符串,它需要被''分隔''。 – 2012-08-10 19:33:20

0

這可能會發生,因爲您沒有引用char值。試試這個

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + ''''; 
+0

謝謝!我以爲是這樣的,但是我一定有錯誤的語法,因爲我沒有到任何地方。 – apd23 2012-08-10 19:34:11

0

當您嘗試執行SQL時,這會失敗嗎?或者,如果您對EXEC呼叫發表評論,它是否仍然失敗?

有一件事引起了我的注意,就是您的@value周圍沒有任何單引號。所以@sql建成時,它最終會但建設它...

WHERE ACTNUMST = 1806-11-801-1000 

,它應該是這樣的......

WHERE ACTNUMST = '1806-11-801-1000' 

如果這確實是你的問題,然後你應該將你的SET @sql修改爲如下...

SET @sql = 'SELECT ACTINDX FROM ' + quotename(@db) + '.[dbo].[GL00105] WHERE ACTNUMST = ''' + @value + ''''; 

這會將單引號添加到你的動態sql語句中。我希望這有幫助。

+0

格式化代碼示例時,請使用'{}'按鈕。 – 2012-08-10 20:40:15