2010-01-27 69 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