【发布时间】:2017-08-22 11:05:02
【问题描述】:
我有这样的结构,可以在更新后触发器中使用动态列名
这两个查询通过这条语句返回ColumnName而不是Value,
(select @Name from deleted)
(select @Name from inserted)
如何从中获取值然后存储到变量中?
ALTER TRIGGER [dbo].[afterUpdate_Project] ON [dbo].[Projects]
FOR UPDATE
as
begin
SET NOCOUNT ON;
DECLARE @ModifiedBy int = (select IsNULL(LastModifiedBy,0) from inserted)
DECLARE @Name varchar(MAX)
DECLARE my_Cursor CURSOR FOR
(
select C.name from sys.tables T
inner join sys.columns C on
T.object_id = C.object_id
where T.name = 'Projects'
)
OPEN my_Cursor;
FETCH NEXT FROM my_Cursor into @Name;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @OldValue nvarchar(MAX) = (select @Name from deleted)
DECLARE @NewValue nvarchar(MAX) = (select @Name from inserted)
print @OldValue
print @NewValue
If (@OldValue <> @NewValue)
BEGIN
insert into EntityHistory
values(1, @Name, @OldValue, @NewValue, @ModifiedBy, GETDATE())
END
FETCH NEXT FROM my_Cursor into @Name;
END
CLOSE my_Cursor; DEALLOCATE my_Cursor;
END
【问题讨论】:
-
您不能传递变量以在选择查询中具有列名。它将作为查询中的静态值注入。喜欢
SELECT 'colName' FROM DELETED。这将导致返回相同的值colName,而不是表中该列的实际数据。您可以在 SSMS 中运行这个简单的示例,看看它是如何工作的。 -
是的,这是我的问题,我怎样才能得到这个查询的结果
-
products 表中有多少列?
-
我有超过 20 列
-
所有列都是 NVARCHAR(MAX) ?