sp_executesql

原创 2007年09月22日 17:50:00
 

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 字符串相似,所以查询优化程序更有可能反复使用执行计划。
 


sp_executesql返回多个值

declare @sql nvarchar(2000)declare @cc intdeclare @ss intselect @sql=Nselect @c=(select count(*) fro...
  • ikmb
  • ikmb
  • 2009年02月23日 16:04
  • 1624

SQL Server 2012 在sp_executesql 中生成的临时表的可见性

在sql存储过程中,经常使用到动态sql语句,写法类似于这样Set @strParameter=N'@StartTime datetime,@EndTime datetime' Exec sp_exe...
  • u014108439
  • u014108439
  • 2017年09月06日 14:49
  • 410

sp_executesql中使用like不生效的问题解决

在sp_executesql中使用like或者not like,不知道什么原因,like不生效而且好像查询的结果是完全错误的。 exec sp_executesql N'select * from T...
  • winnyrain
  • winnyrain
  • 2017年04月19日 09:36
  • 523

SQL:exec sp_executesql 用法

--這種是無效的過程 declare @sql nvarchar(500), @where nvarchar(500),@i nvarchar(64),@p nvarchar(50),@id in...
  • geovindu1
  • geovindu1
  • 2013年07月16日 10:00
  • 961

用sp_executesql执行动态SQL语句及获得返回值

过去我执行拼凑出来的动态SQL语句,do
  • leftfist
  • leftfist
  • 2014年04月28日 22:08
  • 7718

exec与sp_executesql语法的区别详解(转)

动态语句语法: --方法1查询表改为动态 select * from sysobjects exec("select ID,Name from sysobjects") exec s...
  • jimlong
  • jimlong
  • 2012年07月02日 23:24
  • 1415

sqlserver sp_executesql 动态SQL字符长度超过8000

动态SQL字符长度超过8000,我记得SQL SERVER 2005中用SP_EXECUTESQL打破了这个限制。   平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字...
  • txqd1989
  • txqd1989
  • 2017年06月23日 18:00
  • 496

多参数sp_executesql 函数的使用范例

终于搞定sp_executesql包含输出的多参数的调用,网上竟然没有很好的参考   set @sql = Nselect @I_ZSL =sum(I_SL), @I_ZYZ = sum(I_YZ),...
  • Devillyd
  • Devillyd
  • 2007年12月24日 15:46
  • 1743

Exec 执行带参数命令 sp_executesql 的使用

表test1  字段SQLCom  的一条记录是 Select * from Remark  where SystemID=@SystemID CREATE PROCEDURE   Getremak ...
  • xiaosongaspnet
  • xiaosongaspnet
  • 2006年03月23日 11:06
  • 1001

exec与 exec "sp_executesql" 的用法

动态语句语法: --方法1查询表改为动态 select * from sysobjects exec('select ID,Name from sysobjects') exec sp_execut...
  • u011955860
  • u011955860
  • 2016年07月20日 14:51
  • 2507
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sp_executesql
举报原因:
原因补充:

(最多只允许输入30个字)