我有一个程序,我需要检查表中的状态,该状态存在于其他服务器中,需要更新它。
这是我的存储过程..请检查
ALTER PROCEDURE [dbo].[testproceudre]
AS
DECLARE @Status INT
DECLARE @UpdatedDateTime DATETIME
DECLARE @STSFLG INT
--dynamic query variables
DECLARE @SQLString NVARCHAR(4000)
DECLARE @ParmDefinition NVARCHAR(4000)
DECLARE @DBSTRING VARCHAR(1000)
DECLARE @TABLESTR VARCHAR(200)
BEGIN
SET @DBSTRING = '[server name].[db name]'
SET @TABLESTR = ''
DECLARE @SYSproUploadflag INT
DECLARE @DpCodeExist INT
SET @SYSproUploadflag = 0
SET @DpCodeExist = 0
SET @TABLESTR = @DBSTRING+'.[dbo].[otherservertablename]'
SET @ParmDefinition = N'@Status INT,@UpdatedDateTime DATETIME'
SET @SQLString ='SELECT StatusFlg,ConfirmedDate FROM localtablename
JOIN '+ @TABLESTR +' ON
IssuesId=SFAIssueId WHERE Statusflg=4'
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@Status = @Status,
@UpdatedDateTime = @UpdatedDateTime
BEGIN
------------------------------------------------------------------------
IF @SYSproUploadflag = 0
BEGIN
DECLARE PARKCURSOR CURSOR FOR
SELECT STATUS FROM [server name].[db name].[dbo].[otherservertablename]
JOIN localtablename ON SFAISSUEID = ISSUESID
OPEN PARKCURSOR
FETCH NEXT FROM PARKCURSOR
INTO @STSFLG
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF(@STSFLG = 3)
BEGIN
UPDATE issue2 SET status = 4,UpdatedDateTime=ConfirmedDate,
SOURCEOFUPDATION = 'SFA'
FROM [server name].[db name].[dbo].[otherservertablename] issue2 JOIN
tblAHCIssues issue1
ON issue2.sfaissueid=issue1.issuesid
END
IF(@STSFLG = 2)
BEGIN
UPDATE issue2 SET status = 7,UpdatedDateTime=ConfirmedDate,
SOURCEOFUPDATION = 'SFA'
FROM [server name].[db name].[dbo].[otherservertablename] issue2 JOIN
localtablename issue1
ON issue2.sfaissueid=issue1.issuesid
END
FETCH NEXT FROM PARKCURSOR INTO @STSFLG
END
CLOSE PARKCURSOR
DEALLOCATE PARKCURSOR
END
END
END
我的问题是,如果所有行中的状态为2,则更新为7 如果所有行中的3都更新为4 但是如果有些是3而有些是2,那么第一行就是那里,只是它正在更新所有的值。这意味着如果第一行的状态为3,第二行为2,它将两者都更新为4.但是它应该首先更新为4,然后再更新为7.可以任何人帮我解决我的错误吗?
答案 0 :(得分:7)
您的更新中没有where子句 - 每个更新都会更新完全相同的行集(即issuetable中存在匹配问题的issue2中的所有行)。
这意味着最终结果将取决于光标中的最后一个状态ID。