我在我们的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,表示无限。
答案 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
。