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

为SSMS中的常量CHAR(1)创建非NULL计算列

  •  4
  • user166390  · 技术社区  · 13 年前

    在我的数据库中,我有一些计算列来帮助确保引用完整性约束。我使用计算列而不是默认值列,因为我使用的LINQ2SQL不理解数据库中的默认值。

    我的尝试是使用

    CAST('C' as CHAR(1))
    

    自动转换为

    (CONVERT([char](1),'C',0))
    

    通过SSMS。但是,这会导致CHAR(1)列类型为NULL。

    如果我只是使用 'C' ISNULL(NULL,'C') (这确实会导致非NULL类型)该列被拾取为VARCHAR(?)。而且,如果我将两者结合使用 ISNULL(NULL,CONVERT([char](1),'C',0)) ,我回到了一个可为空的CHAR(1)。

    我想要这个有两个原因:

    1. 计算的列将参与与外部CHAR(1)列的关系。

    2. 非NULL CHAR(1)直接映射到LINQ2SQL中的.NET字符类型。


    更新:

    它适用于我 ISNULL(CONVERT([char](1),'C',0),0) ,但我真的不确定“为什么”。如果有什么不同的话,看起来 ISNULL(..,0) 将进一步使类型不统一。

    如果能给我一个很好的解释,我会非常高兴。

    1 回复  |  直到 13 年前
        1
  •  2
  •   Martin Smith    13 年前

    1) 在SQL Server中,不带 N 前缀总是被视为 varchar(x) 哪里 x 是从字符串的长度派生出来的。

     +---------------+--------------+
    | String Length |  Data Type   |
    +---------------+--------------+
    | 0             | varchar(1)   |
    | 1-8000        | varchar(x)   |
    | > 8000        | varchar(max) |
    +---------------+--------------+
    

    2) 如中所述 Computed Columns

    数据库引擎自动确定 根据使用的表达式计算列。大多数的结果 即使只有不可为null的列,表达式也被视为可为null 在场。。。可以为null的表达式可以转换为 通过指定不可为null的 ISNULL(check_expression, constant) , 其中常数是一个非null值,用于替换任何null结果。

    3) 的文档 ISNULL ( check_expression , replacement_value )

    退货类型 返回与check_expression相同的类型。如果文字 NULL作为check_expression提供,返回 替换值。

    这三条信息解释了你问题中的所有行为。