我编写了一个触发器,用于检查两个不同数据库之间的外键约束。它起作用了,但是我想添加一种功能来识别RAISERROR中哪个记录导致了“违反外键约束”。我在第一个SELECT语句中添加了声明的变量@SourceParameterTemplateID,使其等于我要查找的字段。当我这样做时,我会收到两个“错误语法附近”错误。第一个在'='上,第二个在最后的')'上。我一直在寻找可能的解决方案,但是从我遇到的情况来看,这应该可行。任何见识将不胜感激。
Create Trigger AV.testfkTrigger ON [AQB_MON].[AV].[NAAQValue]
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
Declare @SourceParameterTemplateID varchar(25)
IF EXISTS (
SELECT TOP 1 @SourceParameterTemplateID = [SourceParameterTemplateID]
FROM INSERTED AS I
WHERE NOT EXISTS (
SELECT *
FROM [AVData].[dbo].[SourceParameterTemplate] AS A
WHERE I.[SourceParameterTemplateID] = A.[SourceParameterTemplateID]
)
order by [SourceParameterTemplateID]
)
BEGIN
RAISERROR('Violation of foreign key constraint',16,1, @SourceParameterTemplateID);
ROLLBACK;
END
END
最佳答案
这部分IF EXISTS (SELECT TOP 1 @SourceParameterTemplateID
导致语法错误。您可以使用EXIST
并同时分配给SourceParameterTemplateID
。您可以使用以下语法解决此问题:
CREATE TRIGGER AV.testfkTrigger ON [AQB_MON].[AV].[NAAQValue]
FOR INSERT, UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SourceParameterTemplateID VARCHAR(25)
SELECT TOP 1
@SourceParameterTemplateID = [SourceParameterTemplateID]
FROM INSERTED AS I
WHERE NOT EXISTS ( SELECT *
FROM [AVData].[dbo].[SourceParameterTemplate]
AS A
WHERE I.[SourceParameterTemplateID] = A.[SourceParameterTemplateID] )
ORDER BY [SourceParameterTemplateID]
IF @SourceParameterTemplateID IS NOT NULL
BEGIN
DECLARE @msg VARCHAR(250)
set @msg = 'Violation of foreign key constraint for SourceParameterTemplateID: ' + CAST(@SourceParameterTemplateID AS VARCHAR(50))
RAISERROR(@msg,16,1);
ROLLBACK;
END
END
关于sql-server - SQL Server 2012 '='附近的语法不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35589970/