2009-01-20 43 views
0

我需要遍历表中的字段,并在其值不等于其默认值时执行某些操作。SQL Server比较字段值与其默认值

我在触发器中,所以我知道表名。

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.由于 我没有字段名称为常数,只有在一个变量中,我看不到 如何从“插入”表中取出值(记住我在触发器中) 以便查看它是否与默认值相同(现在保存在 @ColDefault作为varchar)。

回答

2

首先,请记住触发器可以同时触发多个记录。如果我这样做:

INSERT INTO dbo.MyTableWithTrigger 
    SELECT * FROM dbo.MyOtherTable 

然后我的触发器MyTableWithTrigger将需要处理多个记录。 “插入的”伪指令将不止有一条记录。

说了这么多,要比较的数据,你可以运行这样的选择语句:

DECLARE @sqlToExec VARCHAR(8000) 
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault 
EXEC(sqlToExec) 

,将返回从插入pseudotable不匹配的默认设置中的所有行。这听起来像是你想对这些行做些什么,所以你可能想要做的是在你调用@sqlToExec字符串之前创建一个临时表,而不是只选择数据,将它插入临时表中。然后你可以使用这些行来做你需要的任何异常处理。

一个catch - 这个T-SQL只适用于数字字段。您可能需要为不同类型的字段构建单独的处理。你可能有varchars,数字,斑点等,你需要不同的方式来比较这些。

+0

无需担心多次插入,即可处理,但始终值得警告。我想我可能不得不开始使用临时表,我会调查该选项。 – 2009-01-20 12:24:42

2

我怀疑你可以使用和exec来做到这一点。

但为什么不只是代码生成一次。它将更具性能