我创建了一个存储过程,该过程用于更新表中的值并将记录输入到另一个表中。应该按照以下步骤进行。
更新 Marks 表中是否选中了商标后,应在表 UpdatedMarkDetails 中输入一条记录,其中记录的 MarkCode 和值(以前的值)
另外,我想知道何时输入不存在的 MarkCode 。所以我放了一条TRY-CATCH语句,但是它也不起作用。查询编辑器中也出现“无法绑定”错误。
代码如下
ALTER PROCEDURE ChangeStatusOfMarks(@GivenMarkCode AS INT, @Value AS NVARCHAR(3))
AS
BEGIN TRY
BEGIN
UPDATE dbo.Marks
SET dbo.Marks.IsChecked = @Value
WHERE dbo.Marks.MarkCode = @GivenMarkCode
END
BEGIN
INSERT INTO [dbo].[UpdatedMarkDetails]
([UpdatedMarkCode],[MarkCode],[ExistedStatus])
VALUES
(NEWID(),
SELECT Marks.MarkCode FROM dbo.Marks,
SELECT Marks.IsChecked FROM dbo.Marks
)
END
END TRY
BEGIN CATCH
SELECT
ERROR_LINE() AS 'ERROR LINE',
ERROR_MESSAGE() AS 'ERROR MESSAGE',
ERROR_SEVERITY() AS 'ERROR SEVERITY'
END CATCH
我得到如下错误
消息156,级别15,状态1,过程ChangeStatusOfMarks,行14 [批处理开始行0] 关键字“ SELECT”附近的语法不正确。
消息156,级别15,状态1,过程ChangeStatusOfMarks,第15行[批处理开始第0行] 关键字“ SELECT”附近的语法不正确。
消息102,级别15,状态1,过程ChangeStatusOfMarks,行16 [批处理开始行0] ')'附近的语法不正确。
答案 0 :(得分:3)
因为有语法错误,这意味着ALTER
SP的SQL失败。与TRY...CATCH
无关。修正语法错误:
ALTER PROCEDURE ChangeStatusOfMarks (@GivenMarkCode AS int,
@Value AS nvarchar(3))
AS
BEGIN TRY
BEGIN
UPDATE dbo.Marks
SET dbo.Marks.IsChecked = @Value
WHERE dbo.Marks.MarkCode = @GivenMarkCode;
END;
BEGIN
INSERT INTO [dbo].[UpdatedMarkDetails] ([UpdatedMarkCode],
[MarkCode],
[ExistedStatus])
VALUES (NEWID(), (SELECT Marks.MarkCode FROM dbo.Marks), (SELECT Marks.IsChecked FROM dbo.Marks));
END;
END TRY
BEGIN CATCH
SELECT ERROR_LINE() AS [ERROR LINE],
ERROR_MESSAGE() AS [ERROR MESSAGE],
ERROR_SEVERITY() AS [ERROR SEVERITY];
END CATCH;
假设,表dbo.Marks
只能永远包含1行。
不过,我个人将INSERT
写为:
INSERT INTO [dbo].[UpdatedMarkDetails] ([UpdatedMarkCode],
[MarkCode],
[ExistedStatus])
SELECT NEWID(),
MarkCode,
IsChecked
FROM dbo.Marks;
我也不确定为什么在这里有TRY...CATCH
。您不会THROW
错误,这意味着如果以上操作失败,错误将不会传播(除非您的目标是?)。也不会在失败时回滚事务(或启动事务)。但是,那是一个不同的问题/答案,只是提出了我要解决的问题的答案。