关闭

sp_executesql

425人阅读 评论(0) 收藏 举报
 

HTML Tags and JavaScript tutorial



sp_executesql





以下是SqlServer的联机文档:
执行可以多次重用或动态生成的 Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。
语法
sp_executesql
[
@stmt

=
]
stmt
[
    
{
,
[
@params

=
]
N'@
parameter_name  data_type
[
,
...
n
]
'
}
    {
,
[
@
param1
=
]
'
value1
'
[
,
...
n
] }
]
参数
[
@stmt

=
]
stmt
包含 Transact-SQL 语句或批处理的 Unicode 字符串,
stmt
必须是可以隐式转换为
ntext
的 Unicode 常量或变量。不允许使用更复杂的 Unicode 表达式(例如使用 + 运算符串联两个字符串)。不允许使用字符常量。如果指定常量,则必须使用 N 作为前缀。例如,Unicode 常量 N'sp_who' 是有效的,但是字符常量 'sp_who' 则无效。字符串的大小仅受可用数据库服务器内存限制。
stmt
可以包含与变量名形式相同的参数,例如:
N'SELECT * FROM Employees WHERE EmployeeID = @IDParameter'
stmt
中包含的每个参数在
@params
参数定义列表和参数值列表中均必须有对应项。
[
@params

=
]
N'@
parameter_name  data_type
[
,
...
n
]
'
字符串,其中包含已嵌入到
stmt
中的所有参数的定义。该字符串必须是可以隐式转换为
ntext
的 Unicode 常量或变量。每个参数定义均由参数名和数据类型组成。
n
是表明附加参数定义的占位符。
stmt
中指定的每个参数都必须在
@params
中定义。如果
stmt
中的 Transact-SQL 语句或批处理不包含参数,则不需要
@params
。该参数的默认值为 NULL。
[
@
param1
=
]
'
value1
'
参数字符串中定义的第一个参数的值。该值可以是常量或变量。必须为
stmt
中包含的每个参数提供参数值。如果
stmt
中包含的 Transact-SQL 语句或批处理没有参数,则不需要值。
n
附加参数的值的占位符。这些值只能是常量或变量,而不能是更复杂的表达式,例如函数或使用运算符生成的表达式。
返回代码值
0(成功)或 1(失败)
示例
A. 执行简单的 SELECT 语句
下面的示例创建并执行一个简单的 SELECT 语句,其中包含名为
@level
的嵌入参数。
execute sp_executesql N'select * from pubs.dbo.employee where job_lvl = @level', N'@level tinyint', @level = 35
B. 执行动态生成的字符串
下面的示例显示使用
sp_executesql
执行动态生成的字符串。该示例中的存储过程用来向一组表中插入数据,该表用于划分一年的销售数据。一年中的每个月均有一个表,格式如下:
CREATE TABLE May1998Sales (OrderID INT PRIMARY KEY, CustomerID INT NOT NULL, OrderDate DATETIME NULL CHECK (DATEPART(yy, OrderDate) = 1998), OrderMonth INT CHECK (OrderMonth = 5), DeliveryDate DATETIME NULL, CHECK (DATEPART(mm, OrderDate) = OrderMonth) )
有关从这些分区表中检索数据的更多信息,请参见
使用包含分区数据的视图

每个表的名称由月份名的前三个字母、年度的四位数字和常量 Sales 组成。名称可以从订单日期动态生成:
/* Get the first three characters of the month name. */SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) +/* Concatenate the four-digit year; cast as character. */CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) +/* Concatenate the constant 'Sales'. */'Sales'
下面示例中的存储过程动态生成并执行一个 INSERT 语句,向适当的表中插入新订单。该存储过程使用订单日期生成应包含数据的表的名称,然后将名称并入 INSERT 语句。(这是
sp_executesql
的一个简单示例。不包含错误检查,也不包括业务规则检查,例如确保两个表之间订单号没有重复。)
CREATE PROCEDURE InsertSales @PrmOrderID INT, @PrmCustomerID INT, @PrmOrderDate DATETIME, @PrmDeliveryDate DATETIMEASDECLARE @InsertString NVARCHAR(500)DECLARE @OrderMonth INT-- Build the INSERT statement.SET @InsertString = 'INSERT INTO ' + /* Build the name of the table. */ SUBSTRING( DATENAME(mm, @PrmOrderDate), 1, 3) + CAST(DATEPART(yy, @PrmOrderDate) AS CHAR(4) ) + 'Sales' + /* Build a VALUES clause. */ ' VALUES (@InsOrderID, @InsCustID, @InsOrdDate,' + ' @InsOrdMonth, @InsDelDate)'/* Set the value to use for the order month because functions are not allowed in the sp_executesql parameter list. */SET @OrderMonth = DATEPART(mm, @PrmOrderDate)EXEC sp_executesql @InsertString, N'@InsOrderID INT, @InsCustID INT, @InsOrdDate DATETIME, @InsOrdMonth INT, @InsDelDate DATETIME', @PrmOrderID, @PrmCustomerID, @PrmOrderDate, @OrderMonth, @PrmDeliveryDateGO
在该过程中使用
sp_executesql
比使用 EXECUTE 执行字符串更有效。使用
sp_executesql
时,只生成 12 个版本的 INSERT 字符串,每个月的表 1 个。使用 EXECUTE 时,因为参数值不同,每个 INSERT 字符串均是唯一的。尽管两种方法生成的批处理数相同,但因为
sp_executesql
生成的 INSERT 字符串相似,所以查询优化程序更有可能反复使用执行计划。
 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:150489次
    • 积分:4028
    • 等级:
    • 排名:第7678名
    • 原创:242篇
    • 转载:0篇
    • 译文:0篇
    • 评论:16条
    文章存档
    最新评论