澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:解决方案,NOCOUNT优化存储

2019-07-28 作者:数据库网络   |   浏览(153)

曾经有快2个月未有创新博客了,实在是因为前段时间发出了太多的事务,辞了劳作,在湘雅医院待了贰个多月,然后又新换了职业......

  难题是那般的,在VB中施行存款和储蓄进度,想讀取存儲過程再次来到的結果集,存儲過程用到臨時表,在VB中調用存儲過程的時候就出現3704的錯誤,提醒“對象關閉時,不允許操作”,在網上找了广大音信,都不可能解決問題,無疑間在百度精晓上观察一個人提的問題,有人回复,有一條很吻合自个儿的現象,果然解決了哈哈,轉載主要缘由有弹指间:
  1、数据库对象连接被关闭了,那势必会报错的,当然也无法出口任何结果的,那时只需注意“先使用、后关闭”就行了,化解那样的难题正是近日先不要关闭数据库连接就行了。

1、在询问中永不接纳“select *”  检索不供给的列会带来卓绝的系统开采,有句话叫做“我省的则省”;

转自:

在平日的行事中,Sqlserver中有的是知识点是平时应用的,可是不时大家反复忽视了它们,在过去的一年里,一贯采纳的是Mysql,今后又起来接触Sqlserver了,所以就把部分常用又易于忽略的Sqlserver知识点总括一点,以便备忘之用。

  2、再次来到记录为空时,也会报错。如上面包车型客车代码

2、在select清单中防止不供给的列,在连接条件中制止不须求的表;

每一回大家在使用查询分析器调节和测验SQL语句的时候,日常会看到一些消息,提示大家近期有个别许个行受到了影响,那是些什么新闻?在大家调用的时候这么些消息有用吗?是或不是能够关闭呢?

具备的操作都将依据Northwind数据库来进展操作。

澳门新萄京官方网站 1澳门新萄京官方网站 2代码

3、不要在子查询中采纳count()求和进行存在性检查

答案是那么些消息在我们的客户端的应用程序中是未有用的,那个音信是储存进度中的每一个语句的DONE_IN_PROC 信息。

留心:当使用附加Northwind数据库的艺术开始展览数据库迁移的时候,大概会并发错误:“Access is denied”。解决方案: right-click the SQL Server  Management Studio icon and select  Run as administrator。

1     sql = select * from dbcn where 状态='0'
2     Set rs = conn.Execute(sql)
3     If Not rs.EOF Then
4         For m = 1 To rs.RecordCount
5             List_status.AddItem rs(1) & ( & rs(2) & ): & rs(4)
6             rs.MoveNext
7         Next m
8     End If

4、幸免使用五个不等类其余列举行表的连接

小编们能够动用SET NOCOUNT 来调控那个音信,以到达升高程序品质的指标。

数据在线Mock地址:

 

5、制止死锁

MSDN中国救亡剧团助如下:
 
SET NOCOUNT
使再次回到的结果中不含有关于受 Transact-SQL 语句影响的行数的消息。

SET NOCOUNT ON 介绍

在仓库储存进度中,平常用到SET NOCOUNT ON;

澳门新萄京官方网站:解决方案,NOCOUNT优化存储过程。效果:阻止在结果聚焦再次回到显示受T-SQL语句或则usp影响的行计数音讯。
当SET NOCOUNT ON 时候,不回去计数,当SET NOCOUNT OFF时候,再次来到计数。

当SET NOCOUNT ON 时候,会更新@@RowCount,不过不向客户端发送存款和储蓄进程每种语句的DONE_IN_proc消息。

例如存款和储蓄进程中涵盖部分并不回去实际数据的讲话,使用SET NOCOUNT ON时,网络通讯流量便会大方压缩,能够心中有数升高应用程序品质。

SET NOCOUNT 钦定的设置只在施行或运转时候生效,深入分析时候不奏效。

示例:

USE Northwind
GO
SET NOCOUNT OFF;
SELECT TOP 5 OrderDate FROM Orders
GO

试行结果如下:

澳门新萄京官方网站 3澳门新萄京官方网站 4

USE Northwind
GO
SET NOCOUNT ON;
SELECT TOP 5 OrderDate FROM Orders
GO

实行理并了结果如下:

澳门新萄京官方网站 5澳门新萄京官方网站 6

举个例子未有数量的话,这里也会唤醒这样的荒谬,将查询代码放到SQL查询剖析器里运营一下,果然未有数据,呵呵。当然如此的失实能够接纳局地措施排除或过滤的。

6、制止选拔count(*)拿到表的记录数

语法
SET NOCOUNT { ON | OFF }

Go 介绍

假若只是施行一条语句,有未有GO都一样。

假如多条语句之间用GO分隔离就不均等了。

各类被GO分隔的说话都以二个单独的事务,一个言辞推行停业不会影响别的语句实行。

GO 不是 Transact-SQL 语句;而是可为  SQL Server 查询解析器度和胆识别的命令。

假定您的SQL过长的时候,将在写GO,只怕有一对言语,它只可以是率先句操作的,在以前您也得写 GO ,GO的野趣是分批处理语句,有加那些 GO ,就实践GO 行的代码,实行后再奉行接下去的代码。

像以下这种气象下将在用到GO ,以达到分批管理数量的指标,不然将会报错。

IF EXISTS(SELECT 1 FROM sys.views WHERE name='View_OrderInfo')
DROP VIEW View_OrderInfo
create view View_OrderInfo
as
select c.ContactName,c.CompanyName,o.OrderDate,o.ShipName,o.OrderID,o.Freight from [Orders] o inner join Customers c on o.CustomerID=c.CustomerID

会报错

澳门新萄京官方网站 7

必须是:

IF EXISTS(SELECT 1 FROM sys.views WHERE name='View_OrderInfo')
DROP VIEW View_OrderInfo
GO
create view View_OrderInfo
as
select c.ContactName,c.CompanyName,o.OrderDate,o.ShipName,o.OrderID,o.Freight from [Orders] o inner join Customers c on o.CustomerID=c.CustomerID

  3、那便是自作者此次所境遇的标题标着力了,我们将眼光转向存款和储蓄进度。的确,在SQL查询深入分析器里,存储进度是健康运行,而且不会报错,也是有多少。但细心研讨,因为在存款和储蓄进度恐怕含有了关于SQL语句影响行数的音讯,那样一来也就只怕会导致这样的情景。
  展开存款和储蓄进程,在begin后边加上一句代码:set  nocount  on,屏蔽掉那一个消息。OK,VB中的程序巳经能够平常运营了,何况数量也是例行的。

(1)为了获得表中的记录数,大家一般使用下边包车型地铁SQL 语句: SELECT COUNT(*) FROM dbo.orders 那条语句会推行全表扫描技术收获行数。 (2)但下面包车型客车SQL 语句不会进行全表扫描同样可以得到行数: SELECT rows FROM sysindexes

注释
当 SET NOCOUNT 为 ON 时,不回来计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,重临计数。

select count(*)  count(1) count(2) count('a') 之间的区分

count(*):找表中最短的列举行总结行数

count(1) count(2) count('a'):对常数列实行总结行数。它们的实施形式是大同小异的,未有其余差距。

很醒目使用count(1) count(2) count('a')的方法,效能会更高,因为count(*)会先去算出最短的列,然后再去总计。即使以往的Sqlserver查询分析器自动会帮大家做一些优化,但是大家务必清楚它们的兑现原理。

  顺便解释一下吧,张开查询解析器中的帮衬,查找一下关于set nocount on的消息,我们会找到这个东西:
====================================
  SET NOCOUNT
  使再次来到的结果中不分包关于受 Transact-SQL 语句影响的行数的音信。
  语法
  SET NOCOUNT { ON | OFF }
  注释
  当 SET NOCOUNT 为 ON 时,不回来计数(表示受 Transact-SQL 语句影响的行数)。

WHERE id = OBJECT_ID('dbo.Orders') AND indid < 2

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

WITH (NOLOCK)

缺点:

  1.会发生脏读

  2.只适用于select查询语句

优点:

  1.有个别小说说,加了WITH (NOLOCK)的SQL查询效能能够追加33%。

  2.方可用来inner join 或然left join等说话

脏读: 二个用户对三个财富做了修改,此时其余一个用户正好读取了那条被涂改的笔录,然后,第二个用户摒弃修改,数据回到修改此前,那四个不等的结果便是脏读。

详尽内容:

  要提高SQL的询问效率,一般的话大家首先会设想创建目录(index)。其实不外乎index的成立之外,当大家在下SQL Command时,在语法中加一段WITH (NOLOCK)能够改良在线大量询问的条件中数据集被LOCK的光景藉此改革查询的效果。

只是有点千万要留神的便是,WITH (NOLOCK)的SQL SELECT有相当的大恐怕会变成Dirty Read(脏读)。

例如:

SELECT o.OrderID,o.OrderDate,o.Freight,d.Quantity,d.UnitPrice
FROM [dbo].[Orders] o WITH (NOLOCK)
JOIN [dbo].[Order Details] d WITH (NOLOCK)
ON o.OrderID=d.OrderID

DELETE、INSERT、UPDATE那几个必要transaction的下令就不可能使用WITH (NOLOCK)。

加了WITH (NOLOCK)即告诉SQL Server,我们的这段SELECT指令不需求去思虑当下table的transaction lock状态,因而功用上会有刚强的晋升,而且数据库系统的Lock现象会有同理可得的滑坡(富含Dead Lock)。

当使用NoLock时,它同意阅读那个曾经修改只是还不曾交易成功的数码。由此只要有亟待考虑transaction事务数据的实时完整性时,使用WITH (NOLOCK)就要好好思考一下。
假若不需思念transaction,WITH (NOLOCK)大概是个好用的参阅。

  当 SET NOCOUNT 为 OFF 时,重临计数。
  即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。
  当 SET NOCOUNT 为 ON 时,将不给客户端发送存款和储蓄进度中的每种语句的 DONE_IN_PROC 消息。当使用microsoft® SQL Server™ 提供的实用工具实施查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)甘休时将不会在查询结果中体现nn rows affected。
  借使存款和储蓄进度中隐含的一部分言辞并不回来大多事实上的数目,则该装置由于大气滑坡了互联网流量,由此可明显增加品质。
SET NOCOUNT 设置是在试行或运营时设置,并非在分析时设置。
权限
  SET NOCOUNT 权限暗中认可授予全数用户。
  示例
  下例在 osql 实用工具或 SQL Server 查询深入分析器中进行时,可堤防突显有关受影响的行数的新闻。

7、制止使用动态SQL。(1)动态SQL 难以调节和测量试验和故障会诊;       (2)假设用户向动态SQL 提供了输入,那么可能存在SQL 注入风险。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存款和储蓄进度中的每一种语句的 DONE_IN_PROC 消息。当使用 Microsoft SQL Server 提供的实用工具实施查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在询问结果中展现"nn rows affected"。

Sqlserver高效分页

在SQLserver二零一二从前,分页咱们一般是行使ROW_NUMBEHaval()。以获得第11条到第50条数据为例:

ROW_NUMBELAND()的落真实景况势:

select * from (
    select *, ROW_NUMBER() OVER(Order by a.OrderID DESC ) AS RowNumber from Orders as a
  ) as b
  where RowNumber BETWEEN 11 and 50 

SQLserver二〇一三中OFFSET & FETCH达成格局:

SELECT o.* FROM dbo.Orders o
ORDER BY o.OrderID DESC OFFSET 10 ROWS FETCH NEXT 40 ROWS ONLY

OFFSET & FETCH实现情势尤其简明特别神速。

利用 OFFSET-FETCH 中的限制

  • OQX56DE昂科威 BY 是选择 OFFSET 和 FETCH 子句所必备的。
  • OFFSET 子句必须与 FETCH 一齐使用。恒久无法采取 OGL450DE凯雷德 BY … FETCH。
  • TOP 不可能在同三个询问表明式中与 OFFSET 和 FETCH 一同利用。
  • OFFSET/FETCH 行计数表明式能够是将再次来到整数值的其他算术、常量或参数表达式。该行计数表明式不扶助标量子查询澳门新萄京官方网站 8澳门新萄京官方网站 9

    ALTER PROCEDURE getLightningSendOverTimeOrder --闪电送到期存储过程
    (@OverTimeMinutes INT,--超时时间阈值
    @GetLasterDay int --取最近多少天的订单
    )
    As
    DECLARE @sql NVARCHAR(MAX);
    BEGIN
    set nocount on;
    set @Sql=
    N'WITH    OrderInfo
              --查询近一天的,处理超时的闪电送订单
              AS ( SELECT   ID ,
                            CommunityId ,
                            SubOrderNumber
                   FROM     dbo.[Order] WITH ( NOLOCK )
                   WHERE    DATEDIFF(day, CreatedOn, GETDATE()) <= @GetLasterDay
                            AND DATEDIFF(mi, CreatedOn, ModifiedOn) > @OverTimeMinutes
                            AND LightningSend = 1
                            AND IsDeleted = 0
     --待付款(商品订单),待确认(商品订单),待发货(商品订单),待收货(商品订单)
                            AND OrderStatusId IN (
                            ''C2EE784F-F29B-4E18-8D73-761264339005'',
                            ''FA1A31DF-3855-41BB-9F5C-A09F3AB4C408'',
                            ''ACF190B2-0CA2-43A0-8E6B-70DF8521F4C5'',
                            ''15F06407-C82C-4CA8-984E-37FB3BD9963C'' )
                 ),
           SmsOrder
              --没有发送过信息的订单
              AS ( SELECT   o.ID ,
                            o.CommunityId ,
                            o.SubOrderNumber
                   FROM     OrderInfo o WITH ( NOLOCK )
                            where not EXISTS(SELECT 1 FROM  [dbo].[Sms_LightningSendOrderOverTime] lso
                            WITH ( NOLOCK ) WHERE o.SubOrderNumber = lso.SubOrderNumber)                      
                 ),
            SmsOrderInfo
              AS ( SELECT   
                            so.CommunityId ,
                            so.SubOrderNumber ,
                            p.PublisherId ,
                            c.ConvenienceStoreID ,
                            oi.ProductId ,
                            p.CategoryId ,
                            p.ProcessType
                   FROM     SmsOrder AS so WITH ( NOLOCK )
                            INNER JOIN Community c WITH ( NOLOCK ) ON so.CommunityId = c.ID
                            INNER JOIN dbo.OrderItem oi WITH ( NOLOCK ) ON so.ID = oi.OrderId
                            INNER JOIN dbo.Product p WITH ( NOLOCK ) ON oi.ProductId = p.Id
                                                                  AND p.LightningSend = 1
                                                                   AND p.ProcessType != 1 -- 便利店
                 ),
                MerchantSmsOrderInfo
              AS ( SELECT   
                            so.CommunityId ,
                            so.SubOrderNumber ,
                            p.PublisherId ,
                            c.ConvenienceStoreID ,
                            oi.ProductId ,
                            p.CategoryId ,
                            p.ProcessType
                   FROM     SmsOrder AS so WITH ( NOLOCK )
                            INNER JOIN Community c WITH ( NOLOCK ) ON so.CommunityId = c.ID
                            INNER JOIN dbo.OrderItem oi WITH ( NOLOCK ) ON so.ID = oi.OrderId
                            INNER JOIN dbo.Product p WITH ( NOLOCK ) ON oi.ProductId = p.Id
                                                                  AND p.LightningSend = 1
                                                                  AND p.ProcessType = 1 -- 商家
                 ),
            ResultInfo
            AS ( 
        SELECT   usr.Id AS UserId ,
                            soi.SubOrderNumber ,
                            usr.PhoneNumber
                   FROM     SmsOrderInfo AS soi
                            INNER JOIN dbo.[User] AS usr WITH ( NOLOCK ) ON soi.ConvenienceStoreID = usr.OrgId
                            INNER JOIN dbo.Organization org WITH ( NOLOCK ) ON usr.OrgId = org.Id
                                                                  AND org.Levels = 2 --便利店
                            INNER JOIN OrderDistributaryCategoryRelation AS odcr
                            WITH ( NOLOCK ) ON usr.Id = odcr.MerchantUserId
                                               AND odcr.CategoryType = 1
                                               AND odcr.SellerId = soi.ConvenienceStoreID
                                               AND odcr.CategoryId = soi.CategoryId
                            INNER JOIN OrderDistributary AS odb WITH ( NOLOCK ) ON usr.Id = odb.MerchantUserId
                                                                  AND odb.SellerId = soi.ConvenienceStoreID
                            INNER JOIN OrderDistributaryRelation AS odbr WITH ( NOLOCK ) ON usr.Id = odbr.MerchantUserId
                                                                  AND odbr.MerchantId = soi.ConvenienceStoreID
                   UNION ALL
                   SELECT   u.Id AS UserId ,
                            soi.SubOrderNumber ,
                            u.PhoneNumber
                   FROM     dbo.[User] u WITH ( NOLOCK )
                            INNER JOIN OrderDistributary odb WITH ( NOLOCK ) ON u.Id = odb.MerchantUserId
                                                                AND odb.IsDefault = 1
                            INNER JOIN SmsOrderInfo soi WITH ( NOLOCK ) ON odb.SellerId = soi.ConvenienceStoreID
                 ------------------------------商家-----------------------------
                   UNION ALL
                   SELECT   usr.Id AS UserId ,
                            soi.SubOrderNumber ,
                            usr.PhoneNumber
                   FROM     MerchantSmsOrderInfo AS soi
                            INNER JOIN dbo.[User] AS usr WITH ( NOLOCK ) ON soi.ConvenienceStoreID = usr.OrgId
                            INNER JOIN dbo.Organization org WITH ( NOLOCK ) ON usr.OrgId = org.Id
                                                                  AND org.Levels = 1 --商家
                            INNER JOIN OrderDistributaryCategoryRelation AS odcr
                            WITH ( NOLOCK ) ON usr.Id = odcr.MerchantUserId
                                               AND odcr.CategoryType = 1
                                               AND odcr.CategoryId = soi.CategoryId
                            INNER JOIN OrderDistributary AS odb WITH ( NOLOCK ) ON usr.Id = odb.MerchantUserId
                                                                  AND odb.SellerId = soi.PublisherId
                            INNER JOIN OrderDistributaryRelation AS odbr WITH ( NOLOCK ) ON odcr.MerchantUserId = odbr.MerchantUserId
                                                                  AND odbr.MerchantId = soi.ConvenienceStoreID
                   UNION ALL
                   SELECT   u.Id AS UserId ,
                            soi.SubOrderNumber ,
                            u.PhoneNumber
                   FROM     MerchantSmsOrderInfo soi WITH ( NOLOCK )
                            INNER JOIN OrderDistributary odb WITH ( NOLOCK ) ON odb.SellerId = soi.PublisherId
                                                                AND odb.IsDefault = 1
                                                                AND odb.IsDeleted = 0
                            INNER JOIN dbo.[User] u WITH ( NOLOCK ) ON u.Id = odb.MerchantUserId
                 )
                SELECT  r.SubOrderNumber ,
                r.UserId,
                r.PhoneNumber
        FROM    ResultInfo r '
    exec sp_executesql @Sql,N'@OverTimeMinutes int,@GetLasterDay int',@OverTimeMinutes,@GetLasterDay;
    SET NOCOUNT OFF;
    END
    

    View Code

友好写的三个积累进度例子

澳门新萄京官方网站 10澳门新萄京官方网站 11

--------------------------------------创建闪电送存储过程-----------------------------------
IF EXISTS(Select Name From Sysobjects Where Name='getLightningSendOverTimeOrder' And Xtype='P')
DROP PROCEDURE [dbo].getLightningSendOverTimeOrder
GO
CREATE PROCEDURE getLightningSendOverTimeOrder --闪电送到期存储过程
(@OverTimeMinutes INT,--超时时间阈值
@GetLasterDay int --取最近多少天的订单
)
As
DECLARE @sql NVARCHAR(MAX);
BEGIN
set nocount on;
set @Sql=
N'WITH    OrderInfo
          --查询近一天的,处理超时的闪电送订单
          AS ( SELECT   ID ,
                        CommunityId ,
                        SubOrderNumber
               FROM     dbo.[Order] WITH ( NOLOCK )
               WHERE    DATEDIFF(day, CreatedOn, GETDATE()) <= @GetLasterDay
                        AND DATEDIFF(mi, CreatedOn, ModifiedOn) > @OverTimeMinutes
                        AND LightningSend = 1
                        AND IsDeleted = 0
 --待付款(商品订单),待确认(商品订单),待发货(商品订单),待收货(商品订单)
                        AND OrderStatusId IN (
                        ''C2EE784F-F29B-4E18-8D73-761264339005'',
                        ''FA1A31DF-3855-41BB-9F5C-A09F3AB4C408'',
                        ''ACF190B2-0CA2-43A0-8E6B-70DF8521F4C5'',
                        ''15F06407-C82C-4CA8-984E-37FB3BD9963C'' )
            UNION ALL
--状态一直是待支付状态的
SELECT ID ,
                        CommunityId ,
                        SubOrderNumber
               FROM     dbo.[Order] WITH ( NOLOCK )
               WHERE    DATEDIFF(day, CreatedOn, GETDATE()) <=@GetLasterDay
                        AND LightningSend = 1
                        AND IsDeleted = 0
                        AND (OrderStatusId =''ACF190B2-0CA2-43A0-8E6B-70DF8521F4C5'' AND DATEDIFF(mi, CreatedOn, GETDATE()) >@OverTimeMinutes)
             ),
       SmsOrder
          --需要发送过信息的订单
          AS ( SELECT   o.ID ,
                        o.CommunityId ,
                        o.SubOrderNumber
               FROM     OrderInfo o WITH ( NOLOCK )
                        where not EXISTS(SELECT 1 FROM  [dbo].[Sms_LightningSendOrderOverTime] lso
                        WITH ( NOLOCK ) WHERE o.SubOrderNumber = lso.SubOrderNumber)                      
             ),
        SmsOrderInfo
          AS ( SELECT   
                        so.CommunityId ,
                        so.SubOrderNumber ,
                        p.PublisherId ,
                        c.ConvenienceStoreID ,
                        oi.ProductId ,
                        p.CategoryId ,
                        p.ProcessType
               FROM     SmsOrder AS so WITH ( NOLOCK )
                        INNER JOIN Community c WITH ( NOLOCK ) ON so.CommunityId = c.ID
                        INNER JOIN dbo.OrderItem oi WITH ( NOLOCK ) ON so.ID = oi.OrderId
                        INNER JOIN dbo.Product p WITH ( NOLOCK ) ON oi.ProductId = p.Id
                                                              AND p.LightningSend = 1
                                                               AND p.ProcessType != 1 -- 便利店
             ),
            MerchantSmsOrderInfo
          AS ( SELECT   
                        so.CommunityId ,
                        so.SubOrderNumber ,
                        p.PublisherId ,
                        c.ConvenienceStoreID ,
                        oi.ProductId ,
                        p.CategoryId ,
                        p.ProcessType
               FROM     SmsOrder AS so WITH ( NOLOCK )
                        INNER JOIN Community c WITH ( NOLOCK ) ON so.CommunityId = c.ID
                        INNER JOIN dbo.OrderItem oi WITH ( NOLOCK ) ON so.ID = oi.OrderId
                        INNER JOIN dbo.Product p WITH ( NOLOCK ) ON oi.ProductId = p.Id
                                                              AND p.LightningSend = 1
                                                              AND p.ProcessType = 1 -- 商家
             ),
        ResultInfo
        AS ( 
    SELECT   usr.Id AS UserId ,
                        soi.SubOrderNumber ,
                        usr.PhoneNumber
               FROM     SmsOrderInfo AS soi
                        INNER JOIN dbo.[User] AS usr WITH ( NOLOCK ) ON soi.ConvenienceStoreID = usr.OrgId
                        INNER JOIN dbo.Organization org WITH ( NOLOCK ) ON usr.OrgId = org.Id
                                                              AND org.Levels = 2 --便利店
                        INNER JOIN OrderDistributaryCategoryRelation AS odcr
                        WITH ( NOLOCK ) ON usr.Id = odcr.MerchantUserId
                                           AND odcr.CategoryType = 1
                                           AND odcr.SellerId = soi.ConvenienceStoreID
                                           AND odcr.CategoryId = soi.CategoryId
                        INNER JOIN OrderDistributary AS odb WITH ( NOLOCK ) ON usr.Id = odb.MerchantUserId
                                                              AND odb.SellerId = soi.ConvenienceStoreID
                        INNER JOIN OrderDistributaryRelation AS odbr WITH ( NOLOCK ) ON usr.Id = odbr.MerchantUserId
                                                              AND odbr.MerchantId = soi.ConvenienceStoreID
               UNION ALL
               SELECT   u.Id AS UserId ,
                        soi.SubOrderNumber ,
                        u.PhoneNumber
               FROM     dbo.[User] u WITH ( NOLOCK )
                        INNER JOIN OrderDistributary odb WITH ( NOLOCK ) ON u.Id = odb.MerchantUserId
                                                            AND odb.IsDefault = 1
                        INNER JOIN SmsOrderInfo soi WITH ( NOLOCK ) ON odb.SellerId = soi.ConvenienceStoreID
             ------------------------------商家-----------------------------
               UNION ALL
               SELECT   usr.Id AS UserId ,
                        soi.SubOrderNumber ,
                        usr.PhoneNumber
               FROM     MerchantSmsOrderInfo AS soi
                        INNER JOIN dbo.[User] AS usr WITH ( NOLOCK ) ON soi.ConvenienceStoreID = usr.OrgId
                        INNER JOIN dbo.Organization org WITH ( NOLOCK ) ON usr.OrgId = org.Id
                                                              AND org.Levels = 1 --商家
                        INNER JOIN OrderDistributaryCategoryRelation AS odcr
                        WITH ( NOLOCK ) ON usr.Id = odcr.MerchantUserId
                                           AND odcr.CategoryType = 1
                                           AND odcr.CategoryId = soi.CategoryId
                        INNER JOIN OrderDistributary AS odb WITH ( NOLOCK ) ON usr.Id = odb.MerchantUserId
                                                              AND odb.SellerId = soi.PublisherId
                        INNER JOIN OrderDistributaryRelation AS odbr WITH ( NOLOCK ) ON odcr.MerchantUserId = odbr.MerchantUserId
                                                              AND odbr.MerchantId = soi.ConvenienceStoreID
               UNION ALL
               SELECT   u.Id AS UserId ,
                        soi.SubOrderNumber ,
                        u.PhoneNumber
               FROM     MerchantSmsOrderInfo soi WITH ( NOLOCK )
                        INNER JOIN OrderDistributary odb WITH ( NOLOCK ) ON odb.SellerId = soi.PublisherId
                                                            AND odb.IsDefault = 1
                                                            AND odb.IsDeleted = 0
                        INNER JOIN dbo.[User] u WITH ( NOLOCK ) ON u.Id = odb.MerchantUserId
             )
            SELECT  r.SubOrderNumber ,
            r.UserId,
            r.PhoneNumber
    FROM    ResultInfo r '
exec sp_executesql @Sql,N'@OverTimeMinutes int,@GetLasterDay int',@OverTimeMinutes,@GetLasterDay;
SET NOCOUNT OFF;
END


GO

View Code

澳门新萄京官方网站,demo2:分页存款和储蓄进程

澳门新萄京官方网站 12澳门新萄京官方网站 13

------------------------------------------创建我的优惠券存储过程 created by zouqj-2017-3-1-----------------------------------
IF EXISTS(Select Name From Sysobjects Where Name='usp_GetMyCouponsList' And Xtype='P')
DROP PROCEDURE usp_GetMyCouponsList
GO
CREATE PROC usp_GetMyCouponsList
(
@PageIndex int, --页码
@PageSize int, --
@hostName nvarchar(100),--服务器地址
@MemberID UNIQUEIDENTIFIER, --会员ID
@IsGetTotalInfo BIT,  --是否得到统计信息,1为得到统计信息,0为不得到统计信息,返回记录集
@HasStatus BIT, -- 是否有状态
@CouponsStatus INT --优惠券状态
)
AS
----------------------------------------定义参数--------------------------------------
declare @strSql NVARCHAR(max);
DECLARE @IsUseCount INT
DECLARE @ExpiredCount INT
DECLARE @NoUseCount INT
DECLARE @where NVARCHAR(100);
set nocount on;
----------------------------------------SQL开始--------------------------------------
IF @HasStatus=1
BEGIN
SET @where='m.[State]=@CouponsStatus';
END
ELSE
BEGIN
SET @where='1=1'
END
IF @IsGetTotalInfo=0
BEGIN
SET @strSql=N'SELECT DISTINCT t.* FROM (SELECT m.[State] AS [STATUS],
m.CouponCode AS CouponsCode,
m.CampaignID AS CampaignID,
c.Code as CampaignCode,
c.Name AS CampaignName,
b.ValidityStartTime AS CampaignStartTime,
b.ValidityEndTime AS CampaignEndTime,
c.Price as CouponsAmount,
(CASE WHEN c.IsLimited =1 THEN 1 ELSE 2 END  ) as IsLimited,
c.FullAmount as MinAmount,
e.[Type] AS CouponsType,
(CASE WHEN b.IconUrl IS NULL THEN N'''' WHEN b.IconUrl=N'''' THEN N'''' ELSE @hostName b.IconUrl END) AS IconUrl

FROM  Loy_MemberCoupon m WITH ( NOLOCK ) INNER JOIN 
 [dbo].[MK_Campaign] AS a WITH ( NOLOCK ) ON m.CampaignID=a.ID AND m.MemberID=@MemberID AND ' @where '
        LEFT OUTER JOIN [dbo].[MK_CouponConfig] AS b  WITH ( NOLOCK ) ON a.[ID] = b.[CampaignID] 
        LEFT OUTER JOIN [dbo].[MK_Coupon] AS c WITH ( NOLOCK ) ON b.[CouponID] = c.[ID]
        LEFT OUTER JOIN [dbo].[MK_CouponRestriction] AS d  WITH ( NOLOCK ) ON c.[ID] = d.[CompainID]
        LEFT OUTER JOIN [dbo].[MK_CouponRestrictCategory] AS e WITH ( NOLOCK ) ON d.[ID] = e.[CouponRestrictionID]
        ) t
        ORDER BY t.CampaignEndTime
offset (@PageIndex-1)*@PageSize  ROWS  FETCH NEXT @PageIndex*@PageSize ROWS ONLY'
exec sp_executesql @strSql,N'@PageIndex int,@PageSize int,@hostName nvarchar(100),@MemberID UNIQUEIDENTIFIER,@where NVARCHAR(100),@CouponsStatus int',@PageIndex=@PageIndex,@PageSize=@PageSize,@hostName=@hostName,@MemberID=@MemberID,@where=@where,@CouponsStatus=@CouponsStatus
END
ELSE
BEGIN
-------------------------------------------------------------
SELECT @IsUseCount=COUNT(1) FROM (SELECT DISTINCT m.CouponCode
FROM  Loy_MemberCoupon m WITH ( NOLOCK ) WHERE m.MemberID=@MemberID AND m.[State]=2
        ) t
SELECT @ExpiredCount=COUNT(1) FROM (SELECT DISTINCT m.CouponCode
FROM  Loy_MemberCoupon m WITH ( NOLOCK ) WHERE m.MemberID=@MemberID AND m.[State]=3
        ) t
SELECT @NoUseCount=COUNT(1) FROM (SELECT DISTINCT m.CouponCode
FROM  Loy_MemberCoupon m WITH ( NOLOCK ) WHERE m.MemberID=@MemberID AND m.[State]=1
        ) t
SELECT @IsUseCount AS IsUseCount,@ExpiredCount AS ExpiredCount,@NoUseCount AS NoUseCount
END
----------------------------------------SQL结束--------------------------------------
set nocount off;

View Code

澳门新萄京官方网站 14澳门新萄京官方网站 15代码

8、在写存款和储蓄进程中,在开始写set  nocount on  ,甘休写set nocount off

借使存款和储蓄过程中富含的一对话语并不回来大多其实的多寡,则该装置由于大气回降了互连网流量,因而可鲜明加强品质。

 1 USE pubs
 2 GO
 3 -- Display the count message.
 4 SELECT au_lname
 5 FROM authors
 6 GO
 7 USE pubs
 8 GO
 9 -- SET NOCOUNT to ON and no longer display the count message.
10 SET NOCOUNT ON
11 GO
12 SELECT au_lname
13 FROM authors
14 GO
15 -- Reset SET NOCOUNT to OFF.
16 SET NOCOUNT OFF
17 GO

(当 SET NOCOUNT 为 ON 时,不回去计数(表示受Transact-SQL 语句影响的行数)。 当 SET NOCOUNT 为 OFF 时,再次来到计数(暗中认可为OFF)。

SET NOCOUNT 设置是在试行或运营时设置,实际不是在解析时设置。

 

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

权限
SET NOCOUNT 权限暗中认可授予全部用户。

 

当 SET NOCOUNT 为 ON 时,将不给客户端发送存款和储蓄进度中的各样语句的 DONE_IN_PROC 音讯。当使用 Microsoft® SQL Server™ 提供的实用工具推行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)甘休时将不会在询问结果中呈现"nn 行受影响"。

结论:大家理应在蕴藏进程的底部加上SET NOCOUNT ON 那样的话,在剥离存款和储蓄进度的时候增加 SET NOCOUNT OFF那样的话,以达到优化存储进程的目标。

一经存款和储蓄过程中蕴含的一对说话并不回来相当多其实的数额,则该装置由于大气回退了网络流量,因而可显然加强质量。

多说两句:

SET NOCOUNT 设置是在实践或运转时设置,并非在分析时设置。

1:在翻看SqlServer的提携的时候,要小心“权限”这一节,因为一些语句是急需确定的权杖的,而笔者辈往往忽视。

批注当SET NOCOUNT 为ON 时,不回去计数(表示受Transact-SQL 语句影响的行数)。当SET NOCOUNT 为OFF 时,再次来到计数。 ... 结论:大家理应在仓库储存过程的头顶加上SET NOCOUNT ON 那样的话,在剥离存款和储蓄进度的时候加多SET NOCOUNT OFF那样的话,以达到优化)

2:@@ROWCOUNT是回来受上一语句影响的行数,包罗找到记录的数据、删除的行数、更新的记录数等,不要感觉只是再次来到搜索的记录数据,况且@@ROWCOUNT要紧跟须要看清语句,不然@@ROWCOUNT将再次来到0。

3:如若选取表变量,在标准表达式中要使用别称来代替表名,不然系统会报错。

4:在CUD类的操作中势供给有事务管理。

5:使用错误管理程序,用来检查 @@E奥迪Q5RO汉兰达 系统函数的 T-SQL 语句 (IF) 实际上在经过中解决了 @@ECR-VROOdyssey 值,不能再捕获除零之外的任何值,必须使用 SET 或 SELECT 立刻捕获错误代码。

本文由澳门新萄京官方网站发布于数据库网络,转载请注明出处:澳门新萄京官方网站:解决方案,NOCOUNT优化存储

关键词: