Sql server 2008 如何在exec sp_executesql中使用数值int

Sql server 2008 如何在exec sp_executesql中使用数值int,sql-server-2008,tsql,sql-server-2005,sql-server-2012,Sql Server 2008,Tsql,Sql Server 2005,Sql Server 2012,有没有办法在sp_executesql中使用数字整数 declare @total_test int declare @test int set @sql=N'select @test=count (*) from '+@db+'..'+@table exec sp_executesql @sql set @total_test +=@test 问题是他不会接受任何数字整数, 我甚至不能设置@sql=N'select count(*)…' 有什么想法吗?谢谢您的帮助。您需要在变量中使用输出子句

有没有办法在sp_executesql中使用数字整数

declare @total_test int
declare @test int
set @sql=N'select @test=count (*) from '+@db+'..'+@table
exec sp_executesql @sql
set @total_test +=@test
问题是他不会接受任何数字整数, 我甚至不能设置@sql=N'select count(*)…'


有什么想法吗?谢谢您的帮助。

您需要在变量中使用
输出
子句。另外,在将对象名称连接到动态sql字符串时,必须使用
QUOTENAME()
函数,以防止可能的sql注入攻击

declare @total_test int;
declare @test int;
SET @total_test = 0;

set @sql=N'select @test=count (*) from '+ QUOTENAME(@db)+'..'+ QUOTENAME(@table)

EXECUTE sp_executesql @sql
                     ,N'@test int OUTPUT'
                     ,@test OUTPUT
set @total_test +=@test

@total_test
可能应该在某个地方初始化,因为
NULL+=@test IS NULL
不是问题,这很有帮助:)QUOTENAME()函数的作用是在传递的参数周围放上括号
[]
。因此,传递给该参数的任何内容都被视为对象名。如果您将该服务器设置为链接服务器,并且语法有效。就错误消息而言,我认为您使用的是一个变量“@table_sum”,您在将其传递给动态sql之前没有声明该变量。不要忘记传递给动态sql的任何变量。在向系统存储过程sp_executesql传递参数时,必须声明该变量,因为sp_executesql有自己的作用域,并且任何已声明超出其作用域的变量都不能被sp_executesql访问。是否同时处理所有三个版本?Sql Server 2005/2008/2012?