OBJECTPROPERTY函数以及确定性检验

该函数可以用于于判断函数的确定性

比如:

USE [SIPC]
GO

/****** Object:  UserDefinedFunction [dbo].[DayOnly]    Script Date: 09/21/2018 10:03:08 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[DayOnly](@Date datetime)
RETURNS varchar(12)
AS
BEGIN
	RETURN CONVERT(varchar(12),@Date,101)
END
GO

判断此函数书否具有确定性:

SELECT OBJECTPROPERTY(OBJECT_ID('DayOnly'),'IsDeterministic')

结果是:0,非确定的

很惊讶,但是如果我们在DayOnly函数中添加SCHEMABINDING就不同了(你可能会说schemabinding是什么东西?),像下面这样:

USE [SIPC]
GO
/****** Object:  UserDefinedFunction [dbo].[DayOnly]    Script Date: 09/21/2018 10:05:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[DayOnly](@Date datetime)
RETURNS varchar(12) WITH SCHEMABINDING
AS
BEGIN
	RETURN CONVERT(varchar(12),@Date,101)
END

再运行刚才的OBJECTPROPERTY查询,返回1,确定性函数。

SCHEMABINDING:

SCHEMABINDING   选项,防止视图所引用的表在视图未被调整的情况下发生改变的选项。   
    
  也就是说,一旦视图被指定了WITH   SCHEMABINDING   选项,那么,在修改用于生成当前视图的表或视图   
  时,一旦对当前视图产生影响(导致视图失效),则不允许修改。   
    
  -------------------------------------------------------------------------   
    
  将视图绑定到架构上。指定   SCHEMABINDING   时,select_statement   必须包含所引用的表、视图或用户定义函数的两部分名称   (owner.object)。   
    
  不能除去参与用架构绑定子句创建的视图中的表或视图,除非该视图已被除去或更改,不再具有架构绑定。否则,SQL   Server   会产生错误。另外,如果对参与具有架构绑定的视图的表执行   ALTER   TABLE   语句,而这些语句又会影响该架构绑定视图的定义,则这些语句将会失败。

OBJECTPROPERTY 返回有关当前数据库中的模式作用域对象的信息。此函数不能用于不是模式范围的对象,例如数据定义语言(DDL)触发器和事件通知。

OBJECTPROPERTY 语法:

1 OBJECTPROPERTY ( id , property ) 

参数:

id:表示当前数据库中对象ID的表达式。id是int,并且被假定为当前数据库上下文中的模式作用域对象。id位置也可以是直接的对象名。

property:是表示由id指定的对象返回的信息的表达式。属性可以是以下值之一。

注意:

除非另有说明,否则当属性不是有效的属性名称时返回NULL ,id不是有效的对象ID,

id是指定属性的不受支持的对象类型,或者调用者没有查看对象元数据的权限。

 

属性名称对象类型说明和返回的值
CnstIsClustKey约束

具有聚集索引的 PRIMARY KEY 约束。

1 = True

0 = False

CnstIsColumn约束

单个列上的 CHECK、DEFAULT 或 FOREIGN KEY 约束。

1 = True

0 = False

CnstIsDeleteCascade约束

具有 ON DELETE CASCADE 选项的 FOREIGN KEY 约束。

1 = True

0 = False

CnstIsDisabled约束

禁用的约束。

1 = True

0 = False

CnstIsNonclustKey约束

非聚集索引的 PRIMARY KEY 或 UNIQUE 约束。

1 = True

0 = False

CnstIsNotRepl约束

使用 NOT FOR REPLICATION 关键字定义的约束。

1 = True

0 = False

CnstIsNotTrusted约束

启用约束时未检查现有行,因此可能不是所有行都适用该约束。

1 = True

0 = False

CnstIsUpdateCascade约束

具有 ON UPDATE CASCADE 选项的 FOREIGN KEY 约束。

1 = True

0 = False

ExecIsAfterTrigger触发器

AFTER 触发器。

1 = True

0 = False

ExecIsAnsiNullsOnTransact-SQL 函数、Transact-SQL 过程、Transact-SQL 触发器、视图

创建时的 ANSI_NULLS 设置。

1 = True

0 = False

ExecIsDeleteTrigger触发器

DELETE 触发器。

1 = True

0 = False

ExecIsFirstDeleteTrigger触发器

对表执行 DELETE 时触发的第一个触发器。

1 = True

0 = False

ExecIsFirstInsertTrigger触发器

对表执行 INSERT 时触发的第一个触发器。

1 = True

0 = False

ExecIsFirstUpdateTrigger触发器

对表执行 UPDATE 时触发的第一个触发器。

1 = True

0 = False

ExecIsInsertTrigger触发器

INSERT 触发器。

1 = True

0 = False

ExecIsInsteadOfTrigger触发器

INSTEAD OF 触发器。

1 = True

0 = False

ExecIsLastDeleteTrigger触发器

对表执行 DELETE 时激发的最后一个触发器。

1 = True

0 = False

ExecIsLastInsertTrigger触发器

对表执行 INSERT 时激发的最后一个触发器。

1 = True

0 = False

ExecIsLastUpdateTrigger触发器

对表执行 UPDATE 时激发的最后一个触发器。

1 = True

0 = False

ExecIsQuotedIdentOnTransact-SQL 函数、Transact-SQL 过程、Transact-SQL 触发器、视图

创建时的 QUOTED_IDENTIFIER 设置。

1 = True

0 = False

ExecIsStartup过程

启动过程。

1 = True

0 = False

ExecIsTriggerDisabled触发器

禁用的触发器。

1 = True

0 = False

ExecIsTriggerNotForRepl触发器

定义为 NOT FOR REPLICATION 的触发器。

1 = True

0 = False

ExecIsUpdateTrigger触发器

UPDATE 触发器。

1 = True

0 = False

HasAfterTrigger表、视图

表或视图具有 AFTER 触发器。

1 = True

0 = False

HasDeleteTrigger表、视图

表或视图具有 DELETE 触发器。

1 = True

0 = False

HasInsertTrigger表、视图

表或视图具有 INSERT 触发器。

1 = True

0 = False

HasInsteadOfTrigger表、视图

表或视图具有 INSTEAD OF 触发器。

1 = True

0 = False

HasUpdateTrigger表、视图

表或视图具有 UPDATE 触发器。

1 = True

0 = False

IsAnsiNullsOnTransact-SQL 函数、Transact-SQL 过程、表、Transact-SQL 触发器、视图

指定表的 ANSI NULLS 选项设置为 ON。这表示所有对空值的比较都取值为 UNKNOWN。只要表存在,此设置将应用于表定义中的所有表达式,包括计算列和约束。

1 = True

0 = False

IsCheckCnst架构范围内的任何对象

CHECK 约束。

1 = True

0 = False

IsConstraint架构范围内的任何对象

列或表的单列 CHECK、DEFAULT 或 FOREIGN KEY 约束。

1 = True

0 = False

IsDefault架构范围内的任何对象

绑定的默认值。

1 = True

0 = False

IsDefaultCnst架构范围内的任何对象

DEFAULT 约束。

1 = True

0 = False

IsDeterministic函数、视图

函数或视图的确定性属性。

1 = 确定

0 = 不确定

IsEncryptedTransact-SQL 函数、Transact-SQL 过程、表、Transact-SQL 触发器和视图

指示模块语句的原始文本已转换为模糊格式。模糊代码的输出在 SQL Server 2005 的任何目录视图中都不能直接显示。对系统表或数据库文件没有访问权限的用户不能检索模糊文本。但是,能够通过 DAC 端口访问系统表的用户或能够直接访问数据库文件的用户可以检索此文本。此外,能够向服务器进程附加调试器的用户可在运行时从内存中检索原始过程。

1 = 已加密

0 = 未加密

基本数据类型:int

IsExecuted架构范围内的任何对象

可执行对象(视图、过程、函数或触发器)。

1 = True

0 = False

IsExtendedProc架构范围内的任何对象

扩展过程。

1 = True

0 = False

IsForeignKey架构范围内的任何对象

FOREIGN KEY 约束。

1 = True

0 = False

IsIndexed表、视图

包含索引的表或视图。

1 = True

0 = False

IsIndexable表、视图

可以创建索引的表或视图。

1 = True

0 = False

IsInlineFunction函数

内联函数。

1 = 内联函数

0 = 非内联函数

IsMSShipped架构范围内的任何对象

安装 SQL Server 过程中创建的对象。

1 = True

0 = False

IsPrimaryKey架构范围内的任何对象

PRIMARY KEY 约束。

1 = True

0 = False

NULL = 非函数,或对象 ID 无效。

IsProcedure架构范围内的任何对象

过程。

1 = True

0 = False

IsQuotedIdentOnTransact-SQL 函数、Transact-SQL 过程、表、Transact-SQL 触发器、视图、CHECK 约束、DEFAULT 定义

指定对象的引号标识符设置为 ON。这表示用英文双引号分隔对象定义中涉及的所有表达式中的标识符。

1 = ON

0 = OFF

IsQueue架构范围内的任何对象

Service Broker 队列

1 = True

0 = False

IsReplProc架构范围内的任何对象

复制过程。

1 = True

0 = False

IsRule架构范围内的任何对象

绑定规则。

1 = True

0 = False

IsScalarFunction函数

标量值函数。

1 = 标量值函数

0 = 非标量值函数

IsSchemaBound函数、视图

使用 SCHEMABINDING 创建的绑定到架构的函数或视图。

1 = 绑定到架构

0 = 不绑定架构。

IsSystemTable

系统表。

1 = True

0 = False

IsTable

表。

1 = True

0 = False

IsTableFunction函数

表值函数。

1 = 表值函数

0 = 非表值函数

IsTrigger架构范围内的任何对象

触发器。

1 = True

0 = False

 IsUniqueCnst 架构范围内的任何对象 

UNIQUE 约束。

1 = True

0 = False

 IsUserTable 表 

用户定义的表。

1 = True

0 = False

 IsView 视图 

视图。

1 = True

0 = False

 OwnerId 架构范围内的任何对象

 对象的所有者。

注意:

架构所有者不一定是对象所有者。例如,子对象(其 parent_object_id 为非空值)将始终返回与父对象相同的所有者 ID。

Nonnull = 对象所有者的数据库用户 ID。

 TableDeleteTrigger 表 

表具有 DELETE 触发器。

>1 = 指定类型的第一个触发器的 ID。

 TableDeleteTriggerCount 表 

表具有指定数目的 DELETE 触发器。

>0 = DELETE 触发器数目。

 TableFullTextMergeStatus 表 

表所具有的全文索引当前是否正在合并。

0 = 表没有全文索引,或者全文索引未在合并。

1 = 全文索引正在合并。

 TableFullTextBackgroundUpdateIndexOn 表 

表已启用全文后台更新索引(自动更改跟踪)。

1 = TRUE

0 = FALSE

 TableFulltextCatalogId 表 

表的全文索引数据所在的全文目录的 ID。

非零 = 全文目录 ID,它与全文索引表中标识行的唯一索引相关。

0 = 表没有全文索引。

 TableFulltextChangeTrackingOn 表 

适用于:SQL Server 2008通过SQL Server 2016. 

表格启用了全文变更跟踪。

1 = TRUE 

0 = FALSE

TableFulltextDocsProcessed

适用于:SQL Server 2008通过SQL Server 2016. 

自全文索引开始以来处理的行数。在为全文搜索索引的表中,一行的所有列都被视为要编制索引的一个文档的一部分。

0 =没有主动抓取或全文索引完成。

> 0 =以下之一(A或B):A)自完成,增量或手动更改跟踪人口开始以来,通过插入或更新操作处理的文档数。B)启用了具有后台更新索引总体的更改跟踪后由插入或更新操作处理的行数,全文索引架构已更改,重新创建全文目录或重新启动SQL Server实例等。

NULL =表没有全文索引。

TableFulltextFailCount行数全文搜索没有索引。

0 =人口已经完成。

> 0 =以下(A或B)之一:A)自完全,增量和手动更新开始以来未编入索引的文档数量更改跟踪人口。B)对于具有后台更新索引的变更跟踪,自开始人口以来未编入索引的行数,或者重新启动人口。这可能是由于模式更改,目录重建,服务器重新启动等引起的。

NULL =表没有全文索引。
TableFulltextItemCount成功全文索引的行数
TableFulltextKeyColumn与参与全文索引定义的单列唯一索引相关联的列的ID。

0 =表没有全文索引。
TableFulltextPendingChanges

要处理的挂起更改跟踪项的数目。

0 = 未启用更改跟踪。

NULL = 表没有全文索引。

TableFulltextPopulateStatus

0 = 空闲。

1 = 正在进行完全填充。

2 = 正在进行增量填充。

3 = 正在传播所跟踪的更改。

4 = 正在进行后台更新索引(例如,自动跟踪更改)。

5 = 全文索引已中止或暂停。

TableHasActiveFulltextIndex

表具有活动的全文索引。

1 = True

0 = False

TableHasCheckCnst

表具有 CHECK 约束。

1 = True

0 = False

TableHasClustIndex

表具有聚集索引。

1 = True

0 = False

TableHasDefaultCnst

表具有 DEFAULT 约束。

1 = True

0 = False

TableHasDeleteTrigger

表具有 DELETE 触发器。

1 = True

0 = False

 TableHasForeignKey 表 

表具有 FOREIGN KEY 约束。

1 = True

0 = False

 TableHasForeignRef 表 

表由 FOREIGN KEY 约束引用。

1 = True

0 = False

 TableHasIdentity 表 

表具有标识列。

1 = True

0 = False

 TableHasIndex 表 

表具有任意类型的索引。

1 = True

0 = False

 TableHasInsertTrigger 表 

对象具有 INSERT 触发器。

1 = True

0 = False

 TableHasNonclustIndex 表 

表有非聚集索引。

1 = True

0 = False

 TableHasPrimaryKey 

表具有主键。

1 = True

0 = False

TableHasRowGuidCol

表具有用于唯一标识列的ROWGUIDCOL。

1 = True 

0 = False

TableHasTextImage

表具有 textntext 或 image 列。

1 = True

0 = False

TableHasTimestamp

表具有一个时间戳列。

1 = True 

0 = False

TableHasUniqueCnst

表具有 UNIQUE 约束。

1 = True

0 = False

TableHasUpdateTrigger

对象有 UPDATE 触发器。

1 = True

0 = False

TableHasVarDecimalStorageFormat表启用了vardecimal存储格式。

1 = True 

0 = False
TableInsertTrigger

表具有 INSERT 触发器。

>1 = 指定类型的第一个触发器的 ID。

TableInsertTriggerCount

表有指定数目的 INSERT 触发器。

>0 = INSERT 触发器的个数。

TableIsFake

表不是真实的表。它将由 SQL Server 数据库引擎根据需要在内部进行具体化。

1 = True

0 = False

 TableIsLockedOnBulkLoad 由于bcp或BULK INSERT作业,表被锁定。

1 = True 

0 = False
 TableIsPinned 表被固定在数据缓存中。

0 = False
 TableIsMemoryOptimized 表是内存优化

1 = True 

0 = False 

基本数据类型:int
 TableTextInRowLimit 行中的文本允许的最大字节数。

如果没有设置行中的文本选项,则为0。
TableUpdateTrigger表有一个UPDATE触发器。

> 1 =具有指定类型的第一个触发器的ID。
TableUpdateTriggerCount

该表具有指定数量的UPDATE触发器。

> 0 = UPDATE触发器的数量。

TableHasColumnSet

表具有列集。

0 = False

1 = True

TableTemporalType指定表的类型。

0 =非时间表

1 =系统版本表

2的历史表2 =系统版本化的时间表
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值