将nvarchar值转换为int时转换失败

时间:2010-01-27 11:05:14

标签: sql-server stored-procedures

声明@count nvarchar(max)

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

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

@count变量未获得值0.它将错误显示为

将nvarchar值'select COUNT(*)from tablename'转换为数据类型int时,转换失败。

4 个答案:

答案 0 :(得分: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被清理。

通过在尝试动态查询之前使用参数化查询确保表存在,一个安全检查就是这样:

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

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

如果@Count然后出现在-1,你知道这是因为表名无效

修改
对sp_executesql的引用是here

答案 1 :(得分:3)

这应该有效:

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, @CountOUT=@count OUTPUT;

SELECT @count;

答案 2 :(得分:2)

查看Erland关于Dynamic SQL的标准文章。你也是Data Type Precedences

的“受害者”

答案 3 :(得分:1)

尝试将@count声明为int

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

问题在于,如果你这样做

SELECT @countAsString = 'SELECT ...'

然后@countAsString(是一个字符串)不会保存查询的结果,而是字符串本身。

使用EXEC实际执行动态创建的查询。