【澳门金沙vip】转贴自微软MSDN:建议执行动态SQL时,使用sp_executesql 存储过程而不要使用EXECUTE 语句

摘自SQL server扶助文书档案对大家优查询速度有帮扶!建议利用 sp_executesql
而不用接受 EXECUTE 语句实施字符串。帮助参数替换不唯有使 sp_executesql
比 EXECUTE 更通用,何况还使 sp_executesql
更有效,因为它生成的实施布署更有希望被 SQL Server 重新利用。

1 SQL Server分页表明

  在这里边我们能看出一种接纳sql存款和储蓄进程写的多少控件分页功用,不管给开辟工具中的那三个数据控件,都只要调用这些蕴藏进度就足以兑现如此的办法了,轻巧吗,大家再也不用在依次页面都写过多的SQL语句了。Misrosoft 
SQL
Server是微软开拓的一种管理数据的数据库,现在场景上边最风靡的两款数据库是Access,SQL
Server,
MySQl,Oracl数据库,所谓那么些数据库,只要您学会多个数据库的语法等,其余的你都就大致会动用了,现在就本身读书的SQL
Server作者在这里处差非常少写写,
大家早已学习了一年了,大家学到了什么吗?作者本身问了须臾间,作者开掘自家的确什么都还没学到。除了写个成立表啊,实施轻巧的Sql语句,写轻易的储存进度,大家写过函数吗?写过SQL的一部分高档的事物吧?就是轻便的储存进程,都以我们团结随手写出来的吗,还要查资料,假若真的本人写吗,笔者就不可能说了?????????,所以我们上学的东西还应该有为数不菲啊,我们要坚如磐石,坚贞不渝就是常胜。

自富含批管理

 

2 SQL Server存款和储蓄进度分页

  上边便是协助数据分页的存放进程,值得商量一下,当然,大家要认真的看,技能从当中学到好些个事物啊。

  创立存款和储蓄进程:  

 1 --获取分页的总共数据的信息
 2 
 3 create procedure p_PageList
 4 
 5 (
 6 
 7 @TableName nvarchar(300),  --你所要分页的表名
 8 
 9 @PKey nvarchar(50),        --主键 默认ID
10 
11 @FieldList nvarchar(500),  --需要搜索的字段
12 
13 @Condition nvarchar(1000), --条件,搜索什么条件
14 
15 @OrderBy nvarchar(250),    --排序Order By ID
16 
17 @Sql nvarchar(1000),       --可以使用,也可以不使用,程序可以自动生成sql语句,当然,那样只能简单的查出来所需要的信息
18 
19 @SqlGetRC nvarchar(1000),  --得到总的sql语句,也可以不使用,也可以指定
20 
21 @CurrPage int,             --当前你所查看的那一页
22 
23 @PageSize int,             --每页所要现实的数目
24 
25 @RecordCount int,          --获取数据库中数据的总数目,可以传,也可以不传
26 
27 @result int output         --输出参数
28 
29 )
30 
31 as
32 
33 declare @PageCount int
34 
35 if @SqlGetRC=''  --如果总的数据sql语句为空
36 
37 Set @SqlGetRC='Select @RecordCount=COUNT(0) FROM '+@TableName+@Condition
38 
39 if @RecordCount=-1  --
40 
41 begin
42 
43 exec sp_executesql @SqlGetRC,N'@RecordCount int out',@RecordCount out
44 
45 end
46 
47 Set @PageCount=(@RecordCount+@PageSize-1)/@PageSize
48 
49 if @CurrPage>@PageCount AND @PageCount>0
50 
51 Set @CurrPage=@PageCount
52 
53  
54 
55 if @Sql=''
56 
57 begin
58 
59     if @PageSize=0
60 
61        set @PageSize=10
62 
63     if @CurrPage=1
64 
65        Set @Sql='select top '+Cast(@PageSize as nvarchar)+' '+@FieldList+' FROM '+@TableName+@Condition+' '+@OrderBy
66 
67     else
68 
69        Set @Sql='select top '+Cast(@PageSize as nvarchar)+' '+@FieldList+' FROM '+@TableName+' WHERE ' +@Pkey+' NOT IN (SELECT TOP '+Cast((@CurrPage-1)*@PageSize as nvarchar)+' '+@Pkey+' FROM '++ ' ' + @Condition + ' ' + @OrderBy + ') ' + replace(@Condition,' WHERE 1=1',' ') + ' ' + @OrderBy
70 
71 end
72 
73 exec(@Sql)
74 
75 Select RecordCount=@RecordCount,PageCount=@PageCount
76 
77 Set  @Result=1

sp_executesql 或 EXECUTE
语句实施字符串时,字符串被看成其自蕴涵批管理施行。SQL Server
将Transact-SQL
语句或字符串中的语句编写翻译进一个履行计划,该试行计划单独于含有
sp_executesql 或 EXECUTE
语句的批管理的奉行布置。下列法规适用于自含的批管理:

提出您在实践字符串时,使用 sp_executesql 存款和储蓄进度而不用采用 EXECUTE
语句。由于此存储进度扶助参数替换,因而 sp_executesql 比 EXECUTE
的意义更加多;由于 SQL Server 更也许重用 sp_executesql
生成的执行布署,由此 sp_executesql 比 EXECUTE 更有效。

3 知识点总结

  1:sp_executesql 
实施能够多次重复使用或动态变化的 Transact-SQL 语句或批管理。Transact-SQL
语句或批管理能够蕴含嵌入参数。

    备注:在批管理、名称功用域和数据库上下文方面,sp_executesql
与 EXECUTE 的一坐一起没有差距于。sp_executesql stmt 参数中的 Transact-SQL
语句或批管理在执行 sp_executesql 语句时才编写翻译。随后,将编写翻译 stmt
中的内容,并将其视作实行陈设运转。该实践安插单独于名字为 sp_executesql
的批管理的试行布置。sp_executesql 批管理不能引用调用 sp_executesql
的批管理中评释的变量。sp_executesql 批管理中的本地游标或变量对调用
sp_executesql 的批管理是不可以看到的。对数据库上下文所作的校正只在
sp_executesql 语句截至前有效。

    假设只变动了语句中的参数值,则
sp_executesql 可用来代表存款和储蓄进程往往实践 Transact-SQL 语句。因为
Transact-SQL 语句笔者保持不改变,仅参数值产生变化,所以 SQL Server
查询优化器恐怕重复使用第二次实践时所生成的施行安插。

  2:Cast 
将一种数据类型的表明式显式转变为另一种数据类型的表明式。CAST 和 CONVERT
提供相同的效应。

  3:replace 将率先个字符串表明式中第二个给定字符串表明式的兼具实例都替换为第八个表明式。

    语法:REPLACE (
string_expression1‘ , ‘string_expression2
,’string_expression3‘ )

    ’
string_expression1 ‘:要搜索的字符串表达式。string_expression1
参数的数据类型能够是可隐式转变为 nvarcharntext
的数据类型。

    ’ string_expression2
‘:尝试找寻的字符串表明式。string_expression2
参数的数据类型能够是可隐式转变为 nvarcharntext
的数据类型。

    ’ string_expression3
‘:替换字符串表明式。string_expression3
参数的数据类型能够是可隐式转变为 nvarcharntext
的数据类型。

  返回值

    nvarcharntext
 
假如任意参数为 NULL,则赶回
NULL。

  示例

    上面包车型大巴演示在成品名称列表中找知名称“Anton”并将其替换为“Anthony托”:SELECT
REPLACE(ProductName, ‘Anton’, ‘Anthony托’卡塔尔FROM Products

停止推行 sp_executesql 或EXECUTE 语句时才将sp_executesql
EXECUTE 字符串中的 Transact-SQL
语句编译进施行陈设。推行字符串时才起来解析或检查其错误。施行时才对字符串中引用的称谓进行剖析。实践的字符串中的
Transact-SQL 语句,不可能访问 sp_executesql 或 EXECUTE
语句所在批管理中宣示的别的变量。蕴含 sp_executesql 或 EXECUTE
语句的批管理不能够访谈试行的字符串中定义的变量或局地游标。即使施行字符串有改观数据库上下文的
USE 语句,则对数据库上下文的改观仅持续到 sp_executesql 或 EXECUTE
语句完结。

澳门金沙vip 1 自包蕴批处理)

经过实践下列五个批管理来比如表明:


/* Show not having access to variables from the calling batch. */DECLARE @CharVariable CHAR(3)SET @CharVariable = 'abc'/* sp_executesql fails because @CharVariable has gone out of scope. */sp_executesql N'PRINT @CharVariable'GO/* Show database context resetting after sp_executesql completes. */USE pubsGOsp_executesql N'USE Northwind'GO/* This statement fails because the database context has now returned to pubs. */SELECT * FROM ShippersGO

sp_executesql 或 EXECUTE
语句推行字符串时,字符串将作为它的自包涵批管理试行。SQL Server
会将字符串中的一个或多少个 Transact-SQL 语句编写翻译为单身于批管理(包括
sp_executesql 或 EXECUTE
语句)实践安排的进行布置。下列准绳适用于自富含批管理:

轮番参数值

  • 在执行 sp_executesql 或 EXECUTE 语句从前,不会将
    sp_executesql 或 EXECUTE 字符串中的 Transact-SQL
    语句编写翻译到实施陈设中。奉行字符串以前,不会解析或检查其错误。试行时才对字符串中援引的名目举行剖释。

  • 已进行的字符串中的 Transact-SQL 语句不能够访谈包蕴 sp_executesql
    或 EXECUTE 语句的批管理中扬言的别样变量。满含 sp_executesql
    EXECUTE 语句的批处理无法访谈已实行字符串中定义的变量或局地游标。

  • 倘诺已实践字符串包蕴三个改换数据库上下文的 USE
    语句,则对数据库上下文所做的改观将仅持续到 sp_executesql
    EXECUTE 语句运行结束。

sp_executesql 帮忙对 Transact-SQL
字符串中内定的此外参数的参数值实行沟通,但是 EXECUTE
语句不协助。由此,由 sp_executesql 生成的 Transact-SQL 字符串比由
EXECUTE 语句所生成的更相同。SQL Server 查询优化器只怕今后自
sp_executesql 的 Transact-SQL
语句与原先所实行的语句的实行安顿相相配,以节约编写翻译新的实施布置的支出。

运营下列多个批管理表达了那么些地点:

使用 EXECUTE 语句时,必得将有着参数值调换为字符或 Unicode 并使其变成Transact-SQL 字符串的一有些:

复制)

DECLARE @IntVariable INTDECLARE @SQLString NVARCHAR(500)/* Build and execute a string with one parameter value. */SET @IntVariable = 35SET @SQLString = N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = ' + CAST(@IntVariable AS NVARCHAR(10))EXEC(@SQLString)/* Build and execute a string with a second parameter value. */SET @IntVariable = 201SET @SQLString = N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = ' + CAST(@IntVariable AS NVARCHAR(10))EXEC(@SQLString)
/*Show not having access to variables from the calling batch. */
DECLARE @CharVariable CHAR(3);
SET @CharVariable = 'abc';
/* sp_executesql fails because @CharVariable has gone out of scope. */
EXECUTE sp_executesql N'PRINT @CharVariable';
GO

/* Show database context resetting after sp_executesql finishes. */
USE master;
GO
EXECUTE sp_executesql N'USE AdventureWorks2008R2;'
GO
/* This statement fails because the database context
   has now returned to master. */
SELECT * FROM Sales.Store;
GO

假设语句再度施行,则正是仅部分数之差距是为参数所提供的值分裂,每回施行时也非得改变全新的
Transact-SQL 字符串。进而在底下多少个方面发生额外的支付:

澳门金沙vip 2 轮流参数值)