我需要遍历一个表上的字段,如果它的值不等于它的默认值,我需要做一些事情。
我在触发器中,所以我知道表名。然后,我使用这个循环遍历每个字段:
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‘表中获取值(请记住,我在触发器中),以便查看它是否与默认值(现在作为varchar保存在@ColDefault中)相同。
发布于 2009-01-20 11:50:38
首先,请记住,触发器可以与同时传入的多个记录一起触发。如果我这样做:
INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable那么我在MyTableWithTrigger上的触发器将需要处理多个记录。“插入的”伪表中将有不止一条记录。
话虽如此,为了比较数据,您可以运行如下select语句:
DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)这将返回插入的伪表中与缺省值不匹配的所有行。听起来您想要对这些行做些什么,所以您可能想要做的是在调用@sqlToExec字符串之前创建一个临时表,而不仅仅是选择数据,而是将其插入到临时表中。然后,您可以使用这些行来执行所需的任何异常处理。
一个陷阱--这个T-SQL只适用于数值字段。您可能希望为不同类型的字段构建单独的处理。您可能有varchars、numerics、blob等,您需要用不同的方法来比较它们。
发布于 2011-01-17 23:32:46
我怀疑你可以使用和exec来做这件事。
但是为什么不只生成一次代码呢?它的性能会更好
https://stackoverflow.com/questions/460873
复制相似问题