SQL Server中的非确定性数据类型

5

我在SQL Server数据库中创建表时,注意到了数据库列的一个特定属性Deterministic。请参见下面的截图:

enter image description here

我已经知道有确定性和非确定性的SQL Server函数,但我想知道它是否适用于SQL Server中的数据类型。我询问的原因是,我已经浏览了所有可用的SQL Server v2008和v2012中的数据类型,但是对于所有数据类型,"Deterministic"字段的值都显示为"Yes"。没有任何一个数据类型显示为"No"。
所以我的问题是,这是否是SQL Server中任何数据类型的正确属性,仍然影响列中存储值的方式,还是只是过去的遗留问题,可能来自SQL Server 2000或SQL Server 2005,那里曾经有一些非确定性的数据类型。了解此数据类型特征的任何信息都将非常有用。截至今天,我们在SQL Server中是否有任何非确定性的数据类型?
由于我没有看到任何数据类型的"Deterministic"为"No",因此更加困惑。我也进行了大量的谷歌搜索,但每次搜索都会带我到关于Deterministic和Non-Deterministic SQL Server函数的页面,而没有人谈论与SQL Server数据类型相关的"Non-deterministic"特性。

https://technet.microsoft.com/en-us/library/ms178091(v=sql.110).aspx


计算列可以是非确定性的。 - Blorgbeard
https://msdn.microsoft.com/zh-cn/library/ms188300.aspx 为类型为 int 的列 a 添加一个计算列 -> 列 b 的公式 = a + DATEPART(dd, GETDATE()) 将导致 Deterministic = No。 - artm
1
@Blorgbeard 我使用公式 ([QtyAvailable]*[UnitPrice]) 创建了一个计算列。它的 Deterministic 值仍为 Yes。QtyAvailable 和 UnitPrice 是我的表中两列,分别为 smallintmoney 类型。 - RBT
1
create table t (a int, b money, c AS ([b]+[a]), d AS ([b]+datepart(day,getdate()))) insert into t values (1, 2) select COLUMNPROPERTY (OBJECT_ID('dbo.t'), 'c', 'IsDeterministic') select COLUMNPROPERTY (OBJECT_ID('dbo.t'), 'd', 'IsDeterministic') - artm
1
好的,那是一个确定性公式。尝试包括对一个非确定性函数的调用,比如 getdate() - Blorgbeard
1个回答

5
如果你仔细阅读这篇MSDN文档,你会发现:

IsDeterministic - 列是确定性的。此属性仅适用于计算列和视图列。

它适用于由涉及非确定性函数的其他列派生的列(计算、视图)。 例子:
CREATE TABLE Deterministic
(
    ID int,
    Calculated AS SYSDATETIME()
)

SELECT COLUMNPROPERTY(OBJECT_ID('Deterministic'), 'Calculated', 'IsDeterministic') IsDeterministic
--Returns 0

如果您按照以下方式在此表上创建视图并执行以下查询:
CREATE VIEW vDeterministic AS
SELECT ID, Calculated, DATEADD(D, 1, Calculated) Tomorrow
FROM Deterministic
GO
SELECT 'Calculated' ColumnName,
    COLUMNPROPERTY(OBJECT_ID('vDeterministic'), 'Calculated', 'IsDeterministic') IsDeterministic
UNION ALL
SELECT 'Tomorrow',
    COLUMNPROPERTY(OBJECT_ID('vDeterministic'), 'Tomorrow', 'IsDeterministic')

您还会收到非确定性列。
ColumnName   IsDeterministic
----------   ---------------
Calculated   0
Tomorrow     0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接