我有以下INSTEAD OF UPDATE
触发器,它动态生成代码然后执行它。问题是,当代码执行时,我总是收到错误消息:
无效的对象名称“插入”
触发代码是这样的:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Trigger [dbo].[TACMasterLayouts_VersionVisibilityHandling_updates]
ON [dbo].[TACMasterLayouts_VersionVisibilityHandling]
INSTEAD OF UPDATE
AS
IF @@rowcount = 0
RETURN;
SET NOCOUNT ON
DECLARE @tableToUpdate AS NVARCHAR(MAX) = 'dbo.tacmasterlayouts';
DECLARE @UpdateStatement AS NVARCHAR(MAX)
DECLARE @IdentityField AS NVARCHAR(MAX) = (SELECT Name
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.tacmasterlayouts')
AND is_identity = 1)
SET @UpdateStatement = 'update ' + @tableToUpdate + ' set ';
DECLARE @Fields AS NVARCHAR(MAX)
SELECT @Fields = COALESCE(@Fields + ', ', '') + @tableToUpdate + '.' + Name + ' = inserted.' + Name
FROM sys.columns
WHERE [object_id] = OBJECT_ID('dbo.tacmasterlayouts')
AND Name != @IdentityField;
SET @UpdateStatement = @UpdateStatement + @fields
SET @UpdateStatement = @UpdateStatement + ' FROM ' + @tableToUpdate + ', inserted'
SET @UpdateStatement = @UpdateStatement + ' where ' + @tableToUpdate + '.' + @IdentityField + ' = inserted.' + @IdentityField
EXECUTE sp_executesql @UpdateStatement
动态代码如下所示:
UPDATE TACMasterLayouts SET
TACMasterLayouts.TACMasterLayoutName = inserted.TACMasterLayoutName,
TACMasterLayouts.TACMasterLayoutDestinationFileName = inserted.TACMasterLayoutDestinationFileName,
TACMasterLayouts.LayoutTypeCategoryId = inserted.LayoutTypeCategoryId,
TACMasterLayouts.LayoutTypeId = inserted.LayoutTypeId,
TACMasterLayouts.TACMasterLayoutDescription = inserted.TACMasterLayoutDescription,
TACMasterLayouts.TACMasterLayoutJasper = inserted.TACMasterLayoutJasper,
TACMasterLayouts.TACMasterLayoutJrxml = inserted.TACMasterLayoutJrxml,
TACMasterLayouts.TACMasterLayoutHtml = inserted.TACMasterLayoutHtml,
TACMasterLayouts.TACMasterLayoutDontClone = inserted.TACMasterLayoutDontClone,
TACMasterLayouts.TACMasterLayoutIsSubReport = inserted.TACMasterLayoutIsSubReport,
TACMasterLayouts.TACMasterLayoutVersion = inserted.TACMasterLayoutVersion,
TACMasterLayouts.TACMasterLayoutKey = inserted.TACMasterLayoutKey,
TACMasterLayouts.TACMasterLayoutTimestampLastModified = inserted.TACMasterLayoutTimestampLastModified,
TACMasterLayouts.TACMasterLayoutHash = inserted.TACMasterLayoutHash,
TACMasterLayouts.TACMasterLayoutTimestampLastCheckout = inserted.TACMasterLayoutTimestampLastCheckout,
TACMasterLayouts.TACMasterLayoutCheckedOutByUserId = inserted.TACMasterLayoutCheckedOutByUserId,
TACMasterLayouts.TACMasterLayoutIsCheckedIn = inserted.TACMasterLayoutIsCheckedIn,
TACMasterLayouts.TACMasterLayoutCheckedInByUserId = inserted.TACMasterLayoutCheckedInByUserId,
TACMasterLayouts.TACMasterLayoutCheckedOutFolderName = inserted.TACMasterLayoutCheckedOutFolderName
FROM TACMasterLayouts, inserted
WHERE TACMAsterlayouts.TACMasterLayoutId = inserted.TACMasterLayoutId;
暗示:
如果我在触发器中静态输入动态生成的代码,它工作正常。所以代码本身没问题。
问题:为什么inserted
在这种情况下不可用?以及如何解决?