当前位置: 代码迷 >> Sql Server >> 执行这个数据库脚本时候陷入无止境的执行查询中。不知道是哪里出有关问题了
  详细解决方案

执行这个数据库脚本时候陷入无止境的执行查询中。不知道是哪里出有关问题了

热度:46   发布时间:2016-04-24 08:54:16.0
执行这个数据库脚本时候陷入无止境的执行查询中。。。不知道是哪里出问题了
---执行本脚本前,请先备份数据库.自负后果

USE [QPAccountsDB]
GO

-- 关闭行数
SET NOCOUNT ON

--------------------------------------------------------------------------
-- 清空标识 
-- 注意:如果是重新生成的话,请去掉下面两句前的"--",如果是ID用完了,再次生成的话.请不要去掉

Truncate table GameIdentifier
Truncate table ReserveIdentifier 

--------------------------------------------------------------------------


-- 调试开关
DECLARE @Debug BIT

-- 基数定义
DECLARE @BeginBase INT
DECLARE @EndBase INT
DECLARE @BaseString VARCHAR(10)
DECLARE @ReserveEnd INT

-- 标识开始和结束
DECLARE @BeginGameID INT
DECLARE @EndGameID INT

-- 标识长度
DECLARE @MinIDLength INT
DECLARE @MaxIDLength INT

------------------------------------------------------------------------------
-- 变量初始化
SET @Debug=1

SET @BeginBase =0
SET @EndBase =9
SET @BaseString ='0123456789'

SET @ReserveEnd=100000
SET @BeginGameID=1
SET @EndGameID =999999

SET @MinIDLength=LEN(LTRIM(RTRIM(STR(@BeginGameID))))
SET @MaxIDLength=13

-- 变量初始化
------------------------------------------------------------------------------

-------------------------------------------------------------------------
-- 筛选规则 Begin
DECLARE @tblFilterRules TABLE(Rules VARCHAR(64))
DECLARE @Tmp INT
DECLARE @TmpRules VARCHAR(64)

-------------------------------------------------------------------------
-- AAAAA,BBBBB Begin
SET @Tmp=0
SET @TmpRules=''
WHILE (@BeginBase<@EndBase)
BEGIN
SET @MinIDLength=LEN(LTRIM(RTRIM(STR(@BeginGameID))))

WHILE (@MinIDLength<=@MaxIDLength)
BEGIN
SET @Tmp=0
WHILE (@Tmp<@MinIDLength)
BEGIN
SET @TmpRules=@TmpRules+'['+LTRIM(STR(@BeginBase+1))+']'

SET @Tmp=@Tmp+1
END

IF @TmpRules IS NOT NULL INSERT @tblFilterRules(Rules) VALUES(@TmpRules)
SET @MinIDLength=@MinIDLength+1
SET @TmpRules=''
END

SET @BeginBase=@BeginBase+1
END

-- 还原变量
SET @Tmp=0
SET @TmpRules=''

SET @BeginBase=0
SET @MinIDLength=LEN(LTRIM(RTRIM(STR(@BeginGameID))))  

-- AAAAA,BBBBB END
-------------------------------------------------------------------------
INSERT @tblFilterRules (Rules)
  SELECT '%000%'
UNION ALL SELECT '%111%'
UNION ALL SELECT '%222%'
UNION ALL SELECT '%333%'
UNION ALL SELECT '%444%'
UNION ALL SELECT '%555%'
UNION ALL SELECT '%666%'
UNION ALL SELECT '%777%'
UNION ALL SELECT '%888%'
UNION ALL SELECT '%999%'
-------------------------------------------------------------------------
-- %AAA%,%BBB% Begin

-- %AAA%,%BBB% End
-------------------------------------------------------------------------

-- 还原变量
SET @Tmp=0
SET @TmpRules=''

SET @BeginBase=0
SET @MinIDLength=LEN(LTRIM(RTRIM(STR(@BeginGameID))))

-------------------------------------------------------------------------
-- %521%,%520% Begin
INSERT @tblFilterRules (Rules)
SELECT '%520%'
UNION ALL SELECT '%521%'
UNION ALL SELECT '%527%'

-- %521%,%520% End
-------------------------------------------------------------------------

-------------------------------------------------------------------------
-- %132%,%133% 电话号码 Begin
INSERT @tblFilterRules (Rules)
  SELECT '130[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '131[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '132[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '133[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '134[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '135[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '136[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '137[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '138[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '139[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

UNION ALL SELECT '150[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '151[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '152[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '153[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '154[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '155[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '156[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '157[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '158[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '159[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

UNION ALL SELECT '180[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '181[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '182[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '183[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '184[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '185[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '186[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '187[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '188[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
UNION ALL SELECT '189[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

-- %132%,%133% 电话号码 End

-- 195000 生日号码 Begin
SET @BeginBase =1949
SET @EndBase =2050
SET @TmpRules =''
WHILE (@BeginBase<@EndBase)
BEGIN
SET @TmpRules=@TmpRules+''+LTRIM(STR(@BeginBase))+'[0-1][0-9]'

-- 194901
SET @TmpRules=@TmpRules
INSERT @tblFilterRules (Rules) VALUES ('%'+@TmpRules+'%')

-- 19490101
SET @TmpRules='%'+@TmpRules+'[0-3][0-9]%'
INSERT @tblFilterRules (Rules) VALUES (@TmpRules)

SET @BeginBase=@BeginBase+1
SET @TmpRules=''
END
-- 195000 生日号码 End

-- 吉祥号码 Begin
INSERT @tblFilterRules (Rules)
  SELECT '168%'
UNION ALL SELECT '668%'
UNION ALL SELECT '666%'
UNION ALL SELECT '888%'
UNION ALL SELECT '518%'
UNION ALL SELECT '588%'
UNION ALL SELECT '886%'
UNION ALL SELECT '881%'
UNION ALL SELECT '%1234%'
UNION ALL SELECT '%4321%'
UNION ALL SELECT '%110%'
UNION ALL SELECT '%120%'
UNION ALL SELECT '%119%'
UNION ALL SELECT '800%'
UNION ALL SELECT '400%'
UNION ALL SELECT '600%'
UNION ALL SELECT '%806%'
UNION ALL SELECT '%668%'
UNION ALL SELECT '%888%'
UNION ALL SELECT '%986%'
UNION ALL SELECT '%998%'

UNION ALL SELECT '[1-9]00188'
UNION ALL SELECT '[1-9]22188'
UNION ALL SELECT '[1-9]33188'

UNION ALL SELECT '[1-9]00168'
UNION ALL SELECT '[1-9]22168'
UNION ALL SELECT '[1-9]33168'

UNION ALL SELECT '[1-9]00186'
UNION ALL SELECT '[1-9]22186'
UNION ALL SELECT '[1-9]33186'

UNION ALL SELECT '[1-9]00[1-9]00'
UNION ALL SELECT '[1-9]11[1-9]11'
UNION ALL SELECT '[1-9]22[1-9]22'
UNION ALL SELECT '[1-9]33[1-9]33'
UNION ALL SELECT '[1-9]44[1-9]44'
UNION ALL SELECT '[1-9]55[1-9]55'
UNION ALL SELECT '[1-9]66[1-9]66'
UNION ALL SELECT '[1-9]77[1-9]77'
UNION ALL SELECT '[1-9]88[1-9]88'
UNION ALL SELECT '[1-9]99[1-9]99'

UNION ALL SELECT '[1-9]88[1-9]88'
UNION ALL SELECT '[1-9]888[1-9]888'
UNION ALL SELECT '[1-9]8888[1-9]8888'
UNION ALL SELECT '[1-9]88888[1-9]88888'

UNION ALL SELECT '[1-9]00[1-9]00'
UNION ALL SELECT '[1-9]000[1-9]000'
UNION ALL SELECT '[1-9]0000[1-9]0000'
UNION ALL SELECT '[1-9]00000[1-9]00000'

UNION ALL SELECT '%1314%' -- 一生一世
UNION ALL SELECT '%53770%' -- 我想亲亲你
UNION ALL SELECT '%53719%' -- 我深情依旧
UNION ALL SELECT '%25184%' -- 爱我一辈子
UNION ALL SELECT '%1392010%' -- 一生就爱你一人
UNION ALL SELECT '%220250%' -- 爱爱你爱爱我
UNION ALL SELECT '%584520%' --  我发誓我爱你
UNION ALL SELECT '%246437%' -- 爱是如此神奇
UNION ALL SELECT '%1314925%' -- 一生一世就爱我
UNION ALL SELECT '%594230%' -- 我就是爱想你
UNION ALL SELECT '360%' -- 想念你
UNION ALL SELECT '%2010000%' --  爱你一万年
UNION ALL SELECT '1372%' -- 一厢情愿
UNION ALL SELECT '259695%' -- 爱我就了解我
UNION ALL SELECT '74839%' -- 其实不想走
UNION ALL SELECT '20999%' -- 爱你久久久
UNION ALL SELECT '829475%' -- 被爱就是幸福
-- 吉祥号码 End

-------------------------------------------------------------------------  

-- 调试信息
--IF @Debug=1 SELECT * FROM @tblFilterRules

-- 筛选规则 End
-------------------------------------------------------------------------


-------------------------------------------------------------------------
-- ID生产 Begin

DECLARE @Reserve BIT
SET @Reserve=0
WHILE (@BeginGameID<=@EndGameID)
BEGIN
SET @Reserve=0

-- 保留标识
IF @BeginGameID<=@ReserveEnd
BEGIN
SET @Reserve=1
--print '保留:'+STR(@BeginGameID)+'  ' + @TTRules
INSERT ReserveIdentifier(GameID) VALUES (@BeginGameID)
END
ELSE
BEGIN
-------------------------------------------------------------------------
DECLARE @TTRules VARCHAR(64)

DECLARE CUR_GameIDList CURSOR FOR 
SELECT Rules FROM @tblFilterRules

OPEN CUR_GameIDList

FETCH NEXT FROM CUR_GameIDList INTO @TTRules

WHILE @@FETCH_STATUS = 0
BEGIN
IF @BeginGameID LIKE @TTRules
BEGIN
SET @Reserve=1
--print '保留:'+STR(@BeginGameID)+'  ' + @TTRules
INSERT ReserveIdentifier(GameID) VALUES (@BeginGameID)
BREAK
END


FETCH NEXT FROM CUR_GameIDList into @TTRules
END

CLOSE CUR_GameIDList
DEALLOCATE CUR_GameIDList
-------------------------------------------------------------------------
END

IF @Reserve=0
BEGIN
--print '发布:'+STR(@BeginGameID)
INSERT [GameIdentifier] (GameID) VALUES(@BeginGameID)
END

SET @BeginGameID=@BeginGameID+1
END


-- ID生产 End
-------------------------------------------------------------------------

-- 重新分配
UPDATE AccountsInfo
SET AccountsInfo.Gameid=GameIdentifier.Gameid
FROM GameIdentifier
WHERE AccountsInfo.userid=GameIdentifier.userid

------解决思路----------------------
运行了一下你的代码,发现不是无止境,而是速度慢!解释见下!


---......................................代码省略。。。。。。。。。。。。
----------------------------------  
-- 调试信息
--IF @Debug=1 SELECT * FROM @tblFilterRules
-- 筛选规则 End
-------------------------------------------------------------------------
-------------------------------------------------------------------------
-- ID生产 Begin
DECLARE @Reserve BIT

SET @Reserve=0

--根据上面的设定,@begingameid =0 , @endgameid = 999999, @reserveEnd = 100000
--当手工设定@endgameid = 100000时,速度很快。
--超过100000时变慢。因为超过100000时,会执行后面的游标操作,所以速度明显变慢了。
--你可以将@reserveEnd设大一点,从而避免游标操作,就会发现也会很快结束!!



WHILE ( @BeginGameID <= @EndGameID )
  BEGIN
      SET @Reserve=0

      -- 保留标识
      IF @BeginGameID <= @ReserveEnd
        BEGIN
            SET @Reserve=1

            --print '保留:'+STR(@BeginGameID)+'  ' + @TTRules
            INSERT ReserveIdentifier
                   (GameID)
            VALUES (@BeginGameID)
        END
      ELSE
        BEGIN
            -------------------------------------------------------------------------
            DECLARE @TTRules VARCHAR(64)
            DECLARE CUR_GameIDList CURSOR FOR
              SELECT Rules
              FROM   @tblFilterRules

            OPEN CUR_GameIDList

            FETCH NEXT FROM CUR_GameIDList INTO @TTRules

            WHILE @@FETCH_STATUS = 0
              BEGIN
                  IF @BeginGameID LIKE @TTRules
                    BEGIN
                        SET @Reserve=1

                        --print '保留:'+STR(@BeginGameID)+'  ' + @TTRules
                        INSERT ReserveIdentifier
                               (GameID)
                        VALUES (@BeginGameID)

                        BREAK
                    END

                  FETCH NEXT FROM CUR_GameIDList INTO @TTRules
              END

            CLOSE CUR_GameIDList

            DEALLOCATE CUR_GameIDList
        -------------------------------------------------------------------------
        END

      IF @Reserve = 0
        BEGIN
            --print '发布:'+STR(@BeginGameID)
            INSERT [GameIdentifier]
                   (GameID)
            VALUES(@BeginGameID)
        END

      SET @BeginGameID=@BeginGameID + 1
  END

-- ID生产 End
-------------------------------------------------------------------------
-- 重新分配
UPDATE AccountsInfo
SET    AccountsInfo.Gameid = GameIdentifier.Gameid
FROM   GameIdentifier
WHERE  AccountsInfo.userid = GameIdentifier.userid
  相关解决方案