4

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

我的尝试是使用

CAST('C' as CHAR(1))

它会自动转换为

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

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

如果我只使用'C'ISNULL(NULL,'C')(这会导致非 NULL 类型),则该列将被选为 VARCHAR(?)。而且,如果我将两者结合起来使用ISNULL(NULL,CONVERT([char](1),'C',0)),我又回到了一个 NULL-able CHAR(1)。

我想要这个有两个原因:

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

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


更新:

它适用于我ISNULL(CONVERT([char](1),'C',0),0),但我不确定“为什么”。如果有的话,似乎ISNULL(..,0)会进一步统一类型。

我会很高兴得到一个很好的解释。

4

1 回答 1

2

1) 在 SQL Server 中,没有前缀的字符串文字N总是被视为是从字符串varchar(x)x长度派生而来的。

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

2) 如计算列中所述

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

3) 文件ISNULL ( check_expression , replacement_value )

返回类型返回与 check_expression 相同的类型。如果提供文字 NULL 作为 check_expression,则返回 replacement_value 的数据类型。

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

于 2013-03-23T09:22:26.267 回答