我需要遍历表上的字段并在其值不等于其默认值时执行某些操作。
我在触发器中,所以我知道表名。然后我循环遍历每个 使用此循环的字段:
select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName
while @field < @maxfield
begin
...
然后我可以通过循环在每次迭代中获取字段名称:
select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field
我可以获得该列的默认值:
select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname
我有我需要的一切,但我看不出如何比较2.因为 我没有将字段名称作为常量,只在变量中,我看不到 如何从'inserted'表中获取值(记住我在触发器中) 以查看它是否与默认值相同(现在保存在 @ColDefault作为varchar)。
答案 0 :(得分:2)
首先,请记住,可以同时触发多个记录来触发触发器。如果我这样做:
INSERT INTO dbo.MyTableWithTrigger
SELECT * FROM dbo.MyOtherTable
然后我在MyTableWithTrigger上的触发器将需要处理多个记录。 “插入”的伪记录中不仅包含一条记录。
话虽如此,为了比较数据,你可以像这样运行一个select语句:
DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)
这将返回插入的pseudotable中与默认值不匹配的所有行。听起来你想对那些行做些什么,所以你可能要做的是在调用@sqlToExec字符串之前创建临时表,而不是仅仅选择数据,将其插入临时表。然后,您可以使用这些行来执行您需要的任何异常处理。
一个问题 - 这个T-SQL仅适用于数字字段。您可能希望为不同类型的字段构建单独的处理。你可能有varchars,数字,blob等,你需要不同的方法来比较它们。
答案 1 :(得分:2)
我怀疑你可以使用和执行这个。
但为什么不只是代码生成一次。它会更高效