sql存储过程执行超时已过期。

时间:2018-11-20 12:58:32

标签: sql sql-server-2008 stored-procedures

我在我们的sql server 2008中有几个存储过程,它们一个接一个地执行,我面临着sql错误(执行超时已到期。在操作完成之前超时或服务器没有响应)。最后一个在100万条记录表上更新或插入,而该表处理较小的文件,但是在更新或插入此记录数时,它停止并抛出该错误,我该如何调整存储过程,我试图用sp_updatestates清理服务器但没有运气,我将不胜感激,谢谢,这是我的存储过程代码:

    USE [DBTest]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[SP_UpdateData]

    @ItemsExt dbo.TT_ItemsExt READONLY
AS
BEGIN

    SET NOCOUNT ON;


    Declare 
        @ItemID nvarchar(36)
    ,@DescE nvarchar(50)
    ,etc 
    ,etc
    --------------------------------------- 

    DECLARE Item_cursor CURSOR FOR 
    SELECT 
        ItemID
    ,DescE
    ,etc
    ,etc
    FROM @ItemsExt

    OPEN Item_cursor
    FETCH NEXT FROM Item_cursor INTO
        @ItemID
    ,@DescE
    ,etc
    ,etc

    WHILE @@FETCH_STATUS = 0
    BEGIN


        If exists (select * from Items WHERE ItemID = @ItemID)
        Begin 

            Update dbo.Items SET
            DescEng = @DescE
            ,etc = @etc
            WHERE ItemID = @ItemID
        End
        ElSE
        Begin

            Declare @ItemNumber nvarChar(36)
            SET @ItemNumber = REPLACE((REPLACE(RIGHT(@ItemID, LEN(@ItemID) - 1))

            insert into dbo.Items 
             (ItemID    ,  etc)

            VALUES (@ItemID, etc)
        End

        --ItemsReplacment Table
        If exists (select * from dbo.ItemsReplacement WHERE ItemID = @ItemID)
        Begin 

            Update dbo.ItemsReplacement SET

            ItemAlter= @AlternativeItem
            ,etc
            WHERE ItemID = @ItemID
        End
        ElSE
        Begin

            Insert Into dbo.ItemsReplacement Values (
            @ItemID
            ,etc
            ,etc)
        End

        FETCH NEXT FROM Item_cursor INTO
        @ItemID
        ,@DescE
        ,etc
        ,etc
    END 
    CLOSE Item_cursor;
    DEALLOCATE Item_cursor;

END

ps:执行超时设置为0,表示无限。

1 个答案:

答案 0 :(得分:0)

以下是这些更新和插入的更好方法:

class Router:

    def __init__(self, routername):

        self.__routername = routername

        self.nlist = []
        self.rlist = []

    def print_info(self):

        print(self.nlist)

        print("  ", self.__routername, sep="")
        print("    N: ", ", ".join(sorted(self.nlist)), sep="")
        print("    R: ", ", ".join(sorted(self.rlist)), sep="")

    def add_neighbour(self, router2):
        self.nlist.append(router2.__routername)

        print(self.nlist)


def main():
    mydict = {}

    routerfile = input("Network file: ")

    while True:
        command = input("> ")
        command = command.upper()

        if command == "P":
            routername = input("Enter router name: ")

            if routername not in mydict:
                print("Router was not found.")
            else:
                router = Router(routername)
                router.print_info()


            pass

        elif command == "PA":
            pass

        elif command == "S":
            pass

        elif command == "C":
            router1 = input("Enter 1st router: ")
            router2 = input("Enter 2nd router: ")

            router1 = Router(router1)
            router2 = Router(router2)

            router1.add_neighbour(router2)
            router2.add_neighbour(router1)

            pass

        elif command == "RR":
            pass

        elif command == "NR":
            routername = input("Enter a new name: ")
            router = Router(routername)
            if routername not in mydict:
                mydict[routername] = router
            else:
                print("Name is taken.")

            pass

        elif command == "NN":
            pass

        elif command == "Q":
            print("Simulator closes.")
            return

        else:
            print("Erroneous command!")
            print("Enter one of these commands:")
            print("NR (new router)")
            print("P (print)")  
            print("C (connect)")
            print("NN (new network)")
            print("PA (print all)")
            print("S (send routing tables)")
            print("RR (route request)")
            print("Q (quit)")

main()

这样,您可以避免不必要的游标循环,并让数据库在计划执行时发挥魔力。

顺便说一句:它对这些更新和插入不应该有某种“限制”吗?您是否打算在所有执行中运行所有这些表?

!在您的原始代码上,您使用的是ALTER PROCEDURE [dbo].[SP_UpdateData] @ItemsExt dbo.TT_ItemsExt READONLY AS BEGIN UPDATE IT SET DescEng = ITE.DescE, etc = ITE.etc FROM dbo.Items IT INNER JOIN ItemsExt ITE ON (IT.ItemID = ITE.ItemID); INSERT INTO dbo.Items ( ItemID, etc ) SELECT ITE.ItemID, ITE.etc FROM dbo.ItemsExt ITE; WHERE NOT EXISTS (SELECT 1 FROM dbo.Items WHERE ItemID = ITE.ItemID); UPDATE ITR SET ItemAlt = 0, --AlternativeItem? etc = ITE.etc FROM dbo.ItemsReplacement ITR INNER JOIN ItemsExt ITE ON (ITR.ItemID = ITE.ItemID); INSERT INTO dbo.ItemsReplacement ( ItemID, etc ) SELECT ITE.ItemID, ITE.etc FROM dbo.ItemsExt ITE; WHERE NOT EXISTS (SELECT 1 FROM dbo.ItemsReplacement WHERE ItemID = ITE.ItemID); END ,我在任何地方都找不到。在我的回复中使用了@AlternativeItem