我正在编写一个将映射到 C# 类的查询,并且在获取查询列的类型时,结果是sys.columns 中的某些列可以为 NULL
- is_nullable
- is_replicated
- is_merge_published
- is_dts_replicated
在同一个 sys.columns中还有其他 NOT NULL
- is_rowguidcol
- is_identity
- is_computed
注意:那些列有点
我认为它们应该始终为 NOT NULL,因为 SQL Server 必须知道列的属性。
那么,为什么某些/那些列sys.columns
可以NULL
和/或在哪些情况下会出现?
你是对的,结果永远不可能
NULL
。通过快速调查,看看 的定义sys.columns
。如果我跑:我看到这个:
如果我更改为 DAC 连接,我可以查看此处的列:
结果:
所以源绝对不能为空,对吧?然而,如果您对 执行相同的操作
sys.columns
,则涉及周围表达式的列c.status
将标记为is_nullable = 1
。这更多地反映了所涉及的表达式/数据类型,而不是NULL
值的实际可能性。我最初认为也许
SYSCONV()
做了一些不同的事情CONVERT()
(我们不能使用前者来检查,但我认为它可能在内部工作更像是TRY_CONVERT()
)。事实并非如此,事实上,即使没有任何内部知识也很容易重现:结果:
综上所述,我不知道该给你什么建议。你可以有条件地硬编码这个特定的列是不可空的,不管元数据是什么版本)。