代码之家  ›  专栏  ›  技术社区  ›  J__

SQL Server将字段值与其默认值进行比较

  •  0
  • J__  · 技术社区  · 17 年前

    使用此循环的字段:

    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
    

    我没有字段名作为常量,只是在变量中,我看不见 如何从“inserted”表中获取值(记住我在触发器中) 以查看它是否与默认值相同(现在保留在中)

    2 回复  |  直到 17 年前
        1
  •  2
  •   Brent Ozar    17 年前

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

    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仅适用于数字字段。您可能需要为不同类型的字段构建单独的处理。您可能有varchar、numerics、blob等,您需要不同的方法来比较它们。

        2
  •  2
  •   Brian Sullivan    15 年前

    我想您可以使用和exec来实现这一点。

    但为什么不只生成一次代码呢。这将更有效