2010-01-27 84 views
3

申報@count爲nvarchar(最大)轉換失敗到int

set @count ='select COUNT(*) from '+ @tablename+'' 

if(@count =0) 
begin 
    print 'fail' 
end 
else 
begin 
    print 'success' 
end 
end 

的@count變量是沒有得到的值爲0。它示出了誤差作爲

轉換轉換時失敗nvarchar值'從tablename'選擇COUNT(*)爲數據類型int。

+0

這不起作用,因爲@ COUNT是varchar,其值爲「SELECT COUNT(*)FROM xxxx」,它不是有效數字:)。按照答案中的描述使用動態SQL。 – 2010-01-27 12:10:41

回答

3

這應該w^ork:

DECLARE @SQLString nvarchar(500); 
DECLARE @ParmDefinition nvarchar(500); 
DECLARE @count int 

SET @SQLString = N'SELECT @CountOUT = COUNT(*) FROM ' + @tablename; 
SET @ParmDefinition = N'@CountOUT int OUTPUT'; 

EXECUTE sp_executesql @SQLString, @ParmDefinition, @[email protected] OUTPUT; 

SELECT @count; 
+0

雅這對我來說工作!謝謝你們 – Innova 2010-01-27 11:36:27

+0

但你能否清楚我這兩條路線。 'OUTPUT' SET @ParmDefinition = N'@ CountOUT int OUTPUT'; 和@ CountOUT = @ count OUTPUT; – Innova 2010-01-27 11:41:20

+0

記住可能的SQL注入問題,根據我的回答 – AdaTheDev 2010-01-27 11:44:55

1

嘗試宣告@countint

DECLARE @count AS INT 
SELECT @count = COUNT(*) FROM YourTable 

的問題是,如果你做

SELECT @countAsString = 'SELECT ...' 

然後@countAsString(是一個字符串)將不會保留查詢的結果,但字符串本身。

使用EXEC實際執行動態創建的查詢。

+0

雅我已經嘗試過,同樣的問題,我得到 轉換失敗時,將varchar值轉換爲數據類型int – Innova 2010-01-27 11:09:43

5
DECLARE @Count INTEGER 
DECLARE @nSQL NVARCHAR(1000) 
SET @nSQL = 'SELECT @Count = COUNT(*) FROM ' + @tablename 
EXECUTE sp_executesql @nSQL, N'@Count INTEGER OUT', @Count OUT 

-- Now check @Count 

像這樣的動態sql要格外小心,因爲你打開自己的SQL注入。所以請確保@tablename已被清理。

一張支票是安全的就會是這樣的,通過確保在嘗試動態查詢之前使用參數化查詢表中存在:在-1

DECLARE @Count INTEGER 
DECLARE @nSQL NVARCHAR(1000) 
SET @nSQL = 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE [email protected]) 
    SELECT @Count = COUNT(*) FROM ' + @tablename + ' 
ELSE 
    SELECT @Count = -1' 

EXECUTE sp_executesql @nSQL, N'@TableName NVARCHAR(128), @Count INTEGER OUT', @TableName, @Count OUT 

如果@count然後出來,你就知道這是因爲tablename是無效

編輯:
參考sp_executesql的是here