【问题标题】:SQL Server Compare field value with its defaultSQL Server 将字段值与其默认值进行比较
【发布时间】:2009-01-20 11:17:36
【问题描述】:

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

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

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

我拥有所需的一切,但我不知道如何比较两者。因为 我没有将字段名称作为常量,只有在变量中,我看不到 如何从“插入”表中获取值(记住我在触发器中) 为了查看它是否与默认值相同(现在保存在 @ColDefault 作为 varchar)。

【问题讨论】:

    标签: sql-server triggers default


    【解决方案1】:

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

    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、numeric、blob 等,你需要不同的方法来比较它们。

    【讨论】:

    • 无需担心多次插入,已处理,但总是值得警告。我想我可能必须开始使用临时表了,我会研究这个选项。
    • 我真正需要的是字段值是否与其默认值匹配。即使我将一个存储过程放在一起以返回 True 或 False,那也很好,但它只是能够从作为变量的字段和表名中获取值到另一个变量中,这让我很难.
    【解决方案2】:

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

    但为什么不只生成一次代码。性能会更好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-08
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      相关资源
      最近更新 更多