我正在尝试连续更新两个表作为Else语句的一部分。
因此我将Update语句包装在一个事务中,我认为这是正确的方法,但是在尝试执行此操作时遇到以下错误。 所有变量都在存储过程的开头声明。
有人可以告诉我我错过了什么或做错了吗?
Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'ELSE'.
Msg 137, Level 15, State 2, Line 4
Must declare the scalar variable "@parentID".
Msg 137, Level 15, State 2, Line 11
Must declare the scalar variable "@lastUpdate".
我的SQL(更新:发布完整查询):
ALTER PROCEDURE [dbo].[MOC_UpdateNav]
@itemID int,
@parentID int,
@itemName nvarchar(100),
@linkRef nvarchar(2000),
@sortID int,
@lastUpdate nvarchar(50),
@modBy varchar(50)
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS
(
SELECT *
FROM MOC_Links
WHERE itemID = @itemID
)
INSERT INTO MOC_Links
(
parentID,
itemName,
linkRef,
sortID
)
SELECT @parentID,
@itemName,
@linkRef,
@sortID
INSERT INTO MOC_Log
(
lastUpdate,
modTime,
modBy
)
SELECT @lastUpdate,
GETDATE(),
@modBy
ELSE
BEGIN TRANSACTION
UPDATE MOC_Links
SET parentID = @parentID,
itemName = @itemName,
linkRef = @linkRef,
sortID = @sortID
WHERE itemID = @itemID
UPDATE MOC_Log
SET lastUpdate = @lastUpdate,
modTime = GETDATE(),
modBy = @modBy
WHERE itemID = @itemID
COMMIT
END
蒂姆,非常感谢你提供任何帮助。
答案 0 :(得分:1)
确保你有DECLARED @parentID
和@lastUpdate
变量,并且在ELSE BLOCK中将整个事务包装在BEGIN..END Block中。其余的对我来说似乎很好。
ALTER PROCEDURE [dbo].[MOC_UpdateNav]
@itemID int,
@parentID int,
@itemName nvarchar(100),
@linkRef nvarchar(2000),
@sortID int,
@lastUpdate nvarchar(50),
@modBy varchar(50)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION;
IF NOT EXISTS(SELECT 1 FROM MOC_Links WHERE itemID = @itemID)
BEGIN --<-- This block here
INSERT INTO MOC_Links(parentID, itemName, linkRef, sortID)
VALUES (@parentID,@itemName,@linkRef,@sortID)
INSERT INTO MOC_Log (lastUpdate,modTime,modBy)
VALUES (@lastUpdate,GETDATE(),@modBy)
END
ELSE
BEGIN --<-- This another block here
UPDATE MOC_Links
SET parentID = @parentID
,itemName = @itemName
,linkRef = @linkRef
,sortID = @sortID
WHERE itemID = @itemID
UPDATE MOC_Log
SET lastUpdate = @lastUpdate
,modTime = GETDATE()
,modBy = @modBy
WHERE itemID = @itemID
END
COMMIT TRANSACTION;
END
注意的
不知道整个语句是什么样的,但是这个TRANSACTION包装器会在整个IF..ELSE
语句中更有意义。你不觉得吗?