您的位置:首页 > 数据库

EXEC和sp_executesql的区别

2008-11-21 17:18 387 查看
EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。

例子:

 1.执行存储过程 exec sp_who

2.执行一个动态的批处理

DECLARE @sql NVARCHAR(MAX)

SET @sql = 'SELECT COUNT(ORDERID) FROM Orders';

EXEC(@sql);

sp_executesql命令在SQL Server中引入的比EXEC命令晚一些,它主要为重用执行计划提供更好的支持。

格式:

sp_executesql [ @stmt = ] stmt
[
{, [@params=] N'@parameter_name data_type [ OUT | OUTPUT ][,...n]' }
{, [ @param1 = ] 'value1' [ ,...n ] }
]

stmt 必须是 Unicode 常量或 Unicode 变量。不允许使用字符常量。如果指定了 Unicode 常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。

例子:

1.sp_executesql N'sp_who'

2.支持与 Transact-SQL 字符串分开的参数值的设置

执行简单查询语句:

EXECUTE sp_executesql
N'SELECT * FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID = @level',
N'@level tinyint',
@level = 109;

执行动态参数语句:

DECLARE @IntVariable int;
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @max_title varchar(30);

SET @IntVariable = 197;
SET @SQLString = N'SELECT @max_titleOUT = max(Title)
FROM AdventureWorks.HumanResources.Employee
WHERE ManagerID = @level';
SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;
SELECT @max_title;

sp_executesql 中的参数的能力,与使用 EXECUTE 语句执行字符串相比,有下列优点:

因为在 sp_executesql 字符串中,Transact-SQL 语句的实际文本在两次执行之间并未改变,所以查询优化器应该能将第二次执行中的 Transact-SQL 语句与第一次执行时生成的执行计划匹配。因此,SQL Server 不必编译第二条语句。

Transact-SQL 字符串只生成一次。

整数参数按其本身格式指定。不需要转换为 Unicode。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: