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

3

声明一个名为@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时转换失败。


这段代码无法正常工作,因为@COUNT是一个值为SELECT COUNT(*) FROM xxxx的varchar类型,而不是有效的数字 : )。请按照答案中所述使用动态SQL。 - Grzegorz Gierlik
4个回答

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的参考文献在这里

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;

但是你能为我解释一下这两行代码吗?'OUTPUT'SET @ParmDefinition = N'@CountOUT int OUTPUT';和 @CountOUT=@count OUTPUT; - Innova
sp_executesql接受参数列表,这些参数在变量@ParmDefinition中定义。输出意味着变量在查询中被“填充”了数据,并且可以在查询完成后使用。 - edosoft

2

1
尝试将@count声明为int:
DECLARE @count AS INT
SELECT @count = COUNT(*) FROM YourTable

问题在于如果你这样做

SELECT @countAsString = 'SELECT ...'

如果 @countAsString(作为字符串)不包含查询结果,而是字符串本身。

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


是的,我已经尝试过了,但仍然存在同样的问题。将varchar值转换为数据类型int时出现转换失败的情况。 - Innova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接