代码之家  ›  专栏  ›  技术社区  ›  Kyle Vassella

触发器将空字符串转换为“null”,然后再将其投递到SQL Server十进制列中

  •  0
  • Kyle Vassella  · 技术社区  · 5 年前

    我有一张和我们的 SSMS 数据库表 t_myTable 是的。我遇到的一些列是数据库中具有数字数据类型的列。他们准备允许 null ,但当用户删除数值并尝试发送空值时,它不会从前端发送到数据库。我怀疑是因为这个值是作为空字符串发送回来的 "" 它不能翻译成 无效的 允许的数据类型。

    有没有可以创建的触发器来将这些空字符串转换为 无效的 insert update 去数据库?或者,在这个过程中,一个触发器可能已经发生得太晚了,我需要在 front end API 取而代之的是部分?

    我们叫我的桌子 我的桌子 以及专栏 myNumericColumn 是的。

    我也可能错了,也许这个“空字符串”问题不是我的问题的根源。但我怀疑是的。

    3 回复  |  直到 5 年前
        1
  •  2
  •   Eric Brandt    5 年前

    正如@daleburrell所指出的,处理数据验证的正确位置是在应用程序层。您可以在 NULLIF 函数,它将值转换为 NULL 如果传递了空字符串。

    语法如下:

    SELECT
      ...
      ,NULLIF(ColumnName, '') AS ColumnName
    
        2
  •  0
  •   Sreenivas Gurram    5 年前

    select nullif(Column1, '') from tablename

        3
  •  0
  •   serge    5 年前

    SQL Server不允许将空字符串转换为数字数据类型。因此,在这种情况下,触发器是无用的,即使不是一个:sql server将在插入之前检查转换。

    SELECT CAST('' AS numeric(18,2)) -- Error converting data type varchar to numeric
    CREATE TABLE tab1 (col1 numeric(18,2) NULL);
    INSERT INTO tab1 (col1) VALUES(''); -- Error converting data type varchar to numeric
    

    因为您没有提到这个错误,所以客户端应该传递 '' 是的。这个问题可以在sql profiler中找到:您需要运行它,并查看为了将数据插入到表中而执行的确切sql语句。