zoukankan      html  css  js  c++  java
  • execute sql of linked server and execute procedure of remote

    前段时间写个合区合服的存储过程

    发现直接连接服务器写sql 做交互不如 直接通过链接服务器调用存储过程。

    原sql

    USE [xxxx]
    GO
    /****** 对象:  StoredProcedure [dbo].[USP_UNION_AREA_SERVER]    脚本日期: 04/19/2010 09:43:06 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[USP_UNION_AREA_SERVER]
    (@GAMEID NVARCHAR(32) --- UNION GAME NAME
    ,@RAREAID NVARCHAR(32) ---RESOURCE AREAID
    ,@RSERVERID NVARCHAR(32) --RESOURCE SERVERID
    ,@TAREAID NVARCHAR(32)   -- TARGET AREAID
    ,@TSERVERID NVARCHAR(32) -- TARGET SERVERID
    ,@UPGRADETYPE TINYINT =1  --- 1 UNION AREA /SERVER 
    ,@TOTALBIZID NVARCHAR(4000) OUTPUT --- OUTPUT UPGRADE BIZOFFERID
    )
    AS
    DECLARE @COUNT TINYINT,@tabnumber varchar(4),@tabname sysname,@TOTALBIZID_66 Nvarchar(4000),@TOTALBIZID_76 Nvarchar(4000);
    IF OBJECT_ID(N'TEMPDB..#') IS NOT NULL
    DROP TABLE # ;
    CREATE TABLE #
    (BIZOFFERID NVARCHAR(32));

    /*获取tabnumber 转换进制并把进制转换成字符串并截取最后位*/

    select  @tabnumber= right(sys.fn_varbintohexstr(cast(tablenumber as varbinary(255))),4)
       from [192.168.1.xx].sc5173.dbo.game WHERE ID=@GAMEID;

    /* 获取需要更改游戏分表bizoffer 的表名*/

    select @tabname='bizofferby'+@tabnumber;

    /* 65 主表bkoffer*/

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END

    /*65 BKOfferDB */

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BKOfferDB.dbo.BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END

    /* 65 BKOfferAPI */

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BKOfferAPI.dbo.BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END

    /* 51 BKOFFERDK*/
    Begin
    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) [192.168.1.xx].BKOFFERDK.dbo.BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END
    /*记录修改的bizofferid */
    WAITFOR  DELAY '00:00:03'
    INSERT INTO # SELECT ID FROM [192.168.1.51].BKOFFERDK.dbo.BIZOFFER WITH(NOLOCK)
     WHERE GameId=@GAMEID AND GAMEAREAID=@TAREAID AND GAMESERVERID=@TSERVERID ;
    END


    /* 76游戏分表searchoffer */ -- 改成存储过程在上面建
    IF EXISTS( SELECT 1 FROM [192.168.1.xx].SearchOffer.SYS.TABLES WHERE NAME=@tabname)
    BEGIN
      EXECUTE [192.168.1.xx].SearchOffer.dbo.[USP_UNION_AREA_SERVER_CATEGORY] @GAMEID,@RAREAID,@RSERVERID,@TAREAID,@TSERVERID,@UPGRADETYPE,@tabname,@TOTALBIZID_76 OUTPUT
    END
    /* 66 游戏分表searchoffer  */  -- 改成存储过程在上面建
    IF EXISTS( SELECT 1 FROM [192.168.1.66].SearchOffer.SYS.TABLES WHERE NAME=@tabname)
    BEGIN
     EXECUTE [192.168.1.xx].SearchOffer.dbo.[USP_UNION_AREA_SERVER_CATEGORY]  @GAMEID,@RAREAID,@RSERVERID,@TAREAID,@TSERVERID,@UPGRADETYPE,@tabname,@TOTALBIZID_66 OUTPUT
    END
    ;
    /* 递归输出修改的bizofferid  @TOTALBIZID_66 记录分表的bizofferid  @TOTALBIZID_76 记录76分表的bizofferid*/
    WITH XWJ_X1
    AS
    (SELECT BIZOFFERID,PX=ROW_NUMBER()OVER(ORDER BY (SELECT 1))
     FROM #
    ),
    XWJ_X2
    AS
    (SELECT CAST(BIZOFFERID AS NVARCHAR(4000)) AS BIZOFFERID ,PX FROM XWJ_X1  WHERE PX=1
     UNION ALL
     SELECT CAST(A.BIZOFFERID+','+B.BIZOFFERID AS NVARCHAR(4000)),A.PX
       FROM XWJ_X2 AS B
        INNER JOIN XWJ_X1 AS A ON B.PX=A.PX-1
    )
    SELECT @TOTALBIZID=BIZOFFERID FROM XWJ_X2 AS A WHERE PX=(SELECT MAX(PX) FROM XWJ_X1 AS B)  OPTION(MAXRECURSION 0);
    SELECT @TOTALBIZID=@TOTALBIZID+'|66 '+@tabname+':'+'|76 '+@tabname+':' ;

    其中这段

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) [192.168.1.xx].BKOFFERDK.dbo.BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END
    /*记录修改的bizofferid */
    WAITFOR  DELAY '00:00:03'
    INSERT INTO # SELECT ID FROM [192.168.1.xx].BKOFFERDK.dbo.BIZOFFER WITH(NOLOCK)
     WHERE GameId=@GAMEID AND GAMEAREAID=@TAREAID AND GAMESERVERID=@TSERVERID ;
    END

    执行起来超时严重后经修改

    USE [BKOffer]
    GO
    /****** Object:  StoredProcedure [dbo].[USP_UNION_AREA_SERVER]    Script Date: 05/03/2010 16:24:20 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[USP_UNION_AREA_SERVER]
    (@GAMEID NVARCHAR(32) --- UNION GAME NAME
    ,@RAREAID NVARCHAR(32) ---RESOURCE AREAID
    ,@RSERVERID NVARCHAR(32) --RESOURCE SERVERID
    ,@TAREAID NVARCHAR(32)   -- TARGET AREAID
    ,@TSERVERID NVARCHAR(32) -- TARGET SERVERID
    ,@UPGRADETYPE TINYINT =1  --- 1 UNION AREA /SERVER 
    ,@OPLOGINID nvarchar(32)  ----operator
    ,@OPLOGINIP nvarchar(32) --- operator ip
    )
    AS
    DECLARE @COUNT TINYINT,@tabnumber varchar(4),@tabname sysname,@TOTALBIZID_66 Nvarchar(4000),@TOTALBIZID_76 Nvarchar(4000),@TOTALBIZID nvarchar(4000),@TOTALBIZID_51 nvarchar(4000),@sumcount_51 int;
    IF OBJECT_ID(N'TEMPDB..#') IS NOT NULL
    DROP TABLE # ;
    CREATE TABLE #
    (BIZOFFERID NVARCHAR(32));

    /*获取 tabnumber 转换16进制 并把16进制转换成字符串并截取最后4位 */

    select  @tabnumber= right(sys.fn_varbintohexstr(cast(tablenumber as varbinary(255))),4)
       from [192.168.1.xx].sc5173.dbo.game WHERE ID=@GAMEID;

    /* 获取需要更改游戏分表 bizoffer 的表名*/

    select @tabname='bizofferby'+@tabnumber;

    /* 65 主表 bkoffer*/

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的 bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END

    /*65 BKOfferDB */

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BKOfferDB.dbo.BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的 bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID  ;
      END
      SET @COUNT=@COUNT+1;
    END

    /* 65 BKOfferAPI */

    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BKOfferAPI.dbo.BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的 bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID  ;
      END
      SET @COUNT=@COUNT+1;
    END

    /* 51 BKOFFERDK*/
    EXECUTE [192.168.1.xx].BKOFFERDK.dbo.[USP_UNION_AREA_SERVER_51] @GAMEID,@RAREAID,@RSERVERID,@TAREAID,@TSERVERID,@UPGRADETYPE,@TOTALBIZID_51 output,@sumcount_51 output;


    /* 76游戏分表 searchoffer */ -- 改成存储过程 在76 上面建
    IF EXISTS( SELECT 1 FROM [192.168.1.xx].SearchOffer.SYS.TABLES WHERE NAME=@tabname)
    BEGIN
      EXECUTE [192.168.1.xx].SearchOffer.dbo.[USP_UNION_AREA_SERVER_CATEGORY] @GAMEID,@RAREAID,@RSERVERID,@TAREAID,@TSERVERID,@UPGRADETYPE,@tabname,@TOTALBIZID_76 OUTPUT
    END
    /* 66 游戏分表 searchoffer  */  -- 改成存储过程 在66 上面建
    IF EXISTS( SELECT 1 FROM [192.168.1.xx].SearchOffer.SYS.TABLES WHERE NAME=@tabname)
    BEGIN
     EXECUTE [192.168.1.xx].SearchOffer.dbo.[USP_UNION_AREA_SERVER_CATEGORY]  @GAMEID,@RAREAID,@RSERVERID,@TAREAID,@TSERVERID,@UPGRADETYPE,@tabname,@TOTALBIZID_66 OUTPUT
    END
    ;
    /* 递归输出 修改的 bizofferid  @TOTALBIZID_66 记录66分表 的bizofferid  @TOTALBIZID_76 记录 76分表的 bizofferid*/
    WITH XWJ_X1
    AS
    (SELECT BIZOFFERID,PX=ROW_NUMBER()OVER(ORDER BY (SELECT 1))
     FROM #
    ),
    XWJ_X2
    AS
    (SELECT CAST(BIZOFFERID AS NVARCHAR(4000)) AS BIZOFFERID ,PX FROM XWJ_X1  WHERE PX=1
     UNION ALL
     SELECT CAST(A.BIZOFFERID+','+B.BIZOFFERID AS NVARCHAR(4000)),A.PX
       FROM XWJ_X2 AS B
        INNER JOIN XWJ_X1 AS A ON B.PX=A.PX-1
    )
    SELECT @TOTALBIZID=BIZOFFERID FROM XWJ_X2 AS A WHERE PX=(SELECT MAX(PX) FROM XWJ_X1 AS B)  OPTION(MAXRECURSION 0);
    SELECT @TOTALBIZID=isnull(@TOTALBIZID+';','')+isnull(@TOTALBIZID_51,'')+'|66 '+@tabname+':'+'|76 '+@tabname+':' ;
    insert into MergeAreaServerDataLog(ReportDate,GameId,AreaId,OldAreaId,ServerId,OldServerId,BizOfferSums,Bizofferdetail,OpLoginId,OpLoginIp)
    select getdate(),@GAMEID,@TAREAID,@RAREAID,@TSERVERID,@RSERVERID,(select count(1) from #)+@sumcount_51,@TOTALBIZID,@OPLOGINID,@OpLoginIp;

    替换成

    /* 51 BKOFFERDK*/
    EXECUTE [192.168.1.xx].BKOFFERDK.dbo.[USP_UNION_AREA_SERVER_51] @GAMEID,@RAREAID,@RSERVERID,@TAREAID,@TSERVERID,@UPGRADETYPE,@TOTALBIZID_51 output,@sumcount_51 output;

    USP_UNION_AREA_SERVER_51 代码如下:

    USE [xxxx]
    GO
    /****** 对象:  StoredProcedure [dbo].[USP_UNION_AREA_SERVER_51]    脚本日期: 05/03/2010 16:29:16 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ALTER PROCEDURE [dbo].[USP_UNION_AREA_SERVER_51]
    (@GAMEID NVARCHAR(32) --- UNION GAME NAME
    ,@RAREAID NVARCHAR(32) ---RESOURCE AREAID
    ,@RSERVERID NVARCHAR(32) --RESOURCE SERVERID
    ,@TAREAID NVARCHAR(32)   -- TARGET AREAID
    ,@TSERVERID NVARCHAR(32) -- TARGET SERVERID
    ,@UPGRADETYPE TINYINT =1  --- 1 UNION AREA /SERVER
    ,@TOTALBIZID nvarchar(4000) output
    ,@sumcount int output
    )
    AS
    DECLARE @COUNT TINYINT,@tabnumber varchar(4)
    IF OBJECT_ID(N'TEMPDB..#') IS NOT NULL
    DROP TABLE # ;
    CREATE TABLE #
    (BIZOFFERID NVARCHAR(32));
    /* 51 BKOFFERDK*/
    SET @COUNT=0 ;
    WHILE @COUNT<4
    BEGIN
     SELECT @COUNT;
     WHILE @@ROWCOUNT>0
      BEGIN
        UPDATE TOP(100) BIZOFFER
          SET GAMESERVERID=@TSERVERID
            ,GAMEAREAID=@TAREAID
            ,LastModified=getdate()
     OUTPUT INSERTED.ID INTO #  /*记录修改的 bizofferid */
        WHERE GameId=@GAMEID AND GAMEAREAID=@RAREAID AND GAMESERVERID=@RSERVERID ;
      END
      SET @COUNT=@COUNT+1;
    END
    ;
    /* 递归输出 修改的 bizofferid  @TOTALBIZID_66 记录66分表 的bizofferid  @TOTALBIZID_76 记录 76分表的 bizofferid*/
    WITH XWJ_X1
    AS
    (SELECT BIZOFFERID,PX=ROW_NUMBER()OVER(ORDER BY (SELECT 1))
     FROM #
    ),
    XWJ_X2
    AS
    (SELECT CAST(BIZOFFERID AS NVARCHAR(4000)) AS BIZOFFERID ,PX FROM XWJ_X1  WHERE PX=1
     UNION ALL
     SELECT CAST(A.BIZOFFERID+','+B.BIZOFFERID AS NVARCHAR(4000)),A.PX
       FROM XWJ_X2 AS B
        INNER JOIN XWJ_X1 AS A ON B.PX=A.PX-1
    )
    SELECT @TOTALBIZID=BIZOFFERID FROM XWJ_X2 AS A WHERE PX=(SELECT MAX(PX) FROM XWJ_X1 AS B)  OPTION(MAXRECURSION 0);
    select @sumcount=(select count(1) from #);

    trace 抓下来解决超时问题

  • 相关阅读:
    Step by step Dynamics CRM 2013安装
    SQL Server 2012 Managed Service Account
    Step by step SQL Server 2012的安装
    Step by step 活动目录中添加一个子域
    Step by step 如何创建一个新森林
    向活动目录中添加一个子域
    活动目录的信任关系
    RAID 概述
    DNS 正向查找与反向查找
    Microsoft Dynamics CRM 2013 and 2011 Update Rollups and Service Packs
  • 原文地址:https://www.cnblogs.com/xwj1985/p/1726425.html
Copyright © 2011-2022 走看看