SQL Server比较字段值及其默认值

时间:2009-01-20 11:17:36

标签: sql-server triggers default

我需要遍历表上的字段并在其值不等于其默认值时执行某些操作。

我在触发器中,所以我知道表名。然后我循环遍历每个 使用此循环的字段:

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)。

2 个答案:

答案 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)

我怀疑你可以使用和执行这个。

但为什么不只是代码生成一次。它会更高效