声明一个名为@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的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时转换失败。
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
这应该可以正常工作:
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;
@count
声明为int
:DECLARE @count AS INT
SELECT @count = COUNT(*) FROM YourTable
问题在于如果你这样做
SELECT @countAsString = 'SELECT ...'
如果 @countAsString(作为字符串)不包含查询结果,而是字符串本身。
使用 EXEC
实际执行动态创建的查询。
@COUNT
是一个值为SELECT COUNT(*) FROM xxxx
的varchar类型,而不是有效的数字 : )。请按照答案中所述使用动态SQL。 - Grzegorz Gierlik