【问题标题】:why is the nullability different for same column in same query in 2 identical databses为什么两个相同数据库中相同查询中相同列的可空性不同
【发布时间】:2018-04-11 07:41:21
【问题描述】:

我有 2 个相同的数据库。我有 1 个测试数据库,客户有 1 个生产数据库

我有一个看起来像这样的(简化的)查询

ALTER VIEW nulltest as 
SELECT isnull(NextDate,getdate()) as TillDate  FROM (
SELECT   LEAD(FromDate) OVER (partition by personid ORDER BY fromdate) AS NextDate
FROM   Taxes)t

实际上,TillDate 列永远不会为空,因为它有一个ISNULL 函数。但是当我检查查询的可空性时,我得到了 2 个不同的答案。我用这个查询检查

SELECT sys.columns.is_nullable FROM sys.columns  INNER JOIN sys.objects ON sys.columns.object_id = sys.objects.object_id and sys.objects.name='nulltest'

在我的数据库上,我得到一个 1,而在产品服务器上,我得到一个 0。

什么给了?

更新

两个数据库中的FromDate都是datetime2, not null

@@Version

DB 1:Microsoft SQL Server 2016 (SP1-GDR) (KB4019089) - 13.0.4206.0 (X64) 2017 年 7 月 6 日 07:55:03 版权所有 (c) 微软公司 Windows Server 2012 R2 Essentials 6.3(内部版本 9600:)上的开发人员版(64 位)

DB 2:Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 2014 年 2 月 20 日 20:04:26 版权所有 (c) Windows NT 6.1 上的 Microsoft Corporation Express Edition(64 位)(Build 7601:Service Pack 1)

【问题讨论】:

  • Taxes.FromDate 在两个数据库中的可空性是什么?
  • 另外,SELECT @@VERSION 在两个系统上都提供了什么,数据库兼容级别是多少?这可能是优化器的差异。

标签: sql-server sql-server-2014 sql-server-2016 nullable


【解决方案1】:

我认为问题与可更新视图有关。

is_nullable = 0 表示您不能将该列设置为NULL,在这种情况下,is_nullabeTillDate 视图的TillDate 列相关, 而不是它的来源Taxes 中的FromDate 列(表/视图/函数我不知道是什么)。

如果您尝试执行以下操作:

UPDATE nulltest SET TillDate = NULL WHERE TillDate = GETDATE()

如果TillDate is_nullable = 0 它应该给你一个错误。

现在,它在两个不同的服务器中提供不同的可空性的原因可能与 sql-server 版本和对可更新视图的支持有关。

is_identity_column 与表值函数有类似(未解决)的问题。 (see here)

也许在你的数据库中,你得到is_nullable = 1,这种视图,使用窗口函数(LEAD)会导致类似于我的表值函数及其问题..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多