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。
例子:
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。
相关文章推荐
- SQLServer : EXEC和sp_executesql的区别
- EXEC和sp_executesql的区别
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
- SQLServer : EXEC和sp_executesql的区别
- EXEC与sp_executesql的区别及应用(转)
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
- SQLServer : EXEC和sp_executesql的区别
- SQLServer : EXEC和sp_executesql的区别
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
- SQLServer : EXEC和sp_executesql的区别
- SQL Server EXEC和sp_executesql的区别
- EXEC和sp_executesql的区别
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
- SQLServer : EXEC和sp_executesql的区别
- exec与sp_executesql语法的区别详解
- SQLServer : EXEC和sp_executesql的区别
- SQLServer : EXEC和sp_executesql的区别
- EXEC和sp_executesql的区别
- EXEC和sp_executesql的区别