必发88手机客户端OBJECTPROPERTY使用办法

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

在SQL
server中,这个函数其实用的挺多的,如果你没用过,想必你一定在哪里看到过,现在迷迷糊糊,似懂非懂,今天笔者仔细讲解下它的功能。

OBJECTPROPERTY 语法:

  大家都知道在数据库中有一个系统表sysobjects,里面存储了数据库各个对象的信息。可以查询下看看结果。可以看出每个对象都有一个ID,这个表存储了表,存储过程,触发器,视图等相关信息。注意:字段没有。

1 OBJECTPROPERTY ( id , property ) 

  object_id就是根据对象名称返回该对象的id.
  object_name是根据对象id返回对象名称.
 

参数:

  select object_id(对象名)等同于:
  select id from sysobjects where name=对象名

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

  select object_name(id号)等同于:
  select name from sysobjects where id=id号

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

 

注意:

  SQL SERVER 2000以上版本都支持这个函数。

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

另外一种说明:

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

OBJECT_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

ExecIsAnsiNullsOn Transact-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

ExecIsQuotedIdentOn Transact-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

IsAnsiNullsOn Transact-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 = 不确定

IsEncrypted Transact-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

IsQuotedIdentOn Transact-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 =系统版本化的时间表

必发88手机客户端 1重要提示

 

  使用 OBJECT_ID 不能查询非架构范围内的对象(如 DDL 触发器)。对于在
sys.objects
目录视图中找不到的对象,需要通过查询适当的目录视图来获取该对象的标识号。例如,若要返回
DDL 触发器的对象标识号,请使用 SELECT OBJECT_ID FROM sys.triggers WHERE
name = ‘DatabaseTriggerLog’语法:

返回类型:

1 OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] 
2     object_name' [ ,'object_type' ] )

int

参数:

例外:

   ‘ object_name ‘要使用的对象。object_name 的数据类型为 varchar 或
nvarchar。如果 object_name 的数据类型为 varchar,则它将隐式转换为
nvarchar。可以选择是否指定数据库和架构名称。
  ’ object_type ‘架构范围的对象类型。object_type 的数据类型为
varchar 或 nvarchar。如果 object_type 的数据类型为
varchar,则它将隐式转换为 nvarchar。有关对象类型的列表,请参阅
sys.objects (Transact-SQL) 中的 type 列。
返回类型:int

如果调用者没有查看对象的权限,则返回NULL。

示例:

用户只能查看用户所拥有的或用户已被授予许可权限的元数据。

A. 返回指定对象的对象 ID

这意味着,如果用户对该对象没有任何权限,则元数据发放的内置函数(如OBJECTPROPERTY)可能返回NULL。

1 USE master;
2 GO
3 SELECT OBJECT_ID(N'AdventureWorks.Production.WorkOrder') AS 'Object ID';
4 GO

备注:

B. 验证对象是否存在

数据库引擎假定object_id在当前数据库上下文中。引用一个查询OBJECT_ID在另一个数据库将返回NULL或不正确的结果。

1 USE AdventureWorks;
2 GO
3 IF OBJECT_ID (N'dbo.AWBuildVersion', N'U') IS NOT NULL
4 DROP TABLE dbo.AWBuildVersion;
5 GO

例如,在以下查询中,当前数据库上下文是主数据库。数据库引擎将尝试返回该数据库中指定的object_id的属性值,而不是返回查询中指定的数据库。

另外说明:SQL中object_id函数的用法

 

语法:OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] object_name' [ ,'object_type' ] )

 

参数

 

 object_name 
要使用的对象。object_name 的数据类型为 varchar 或 nvarchar。如果 object_name 的数据类型为 varchar,则它将隐式转换为 nvarchar。可以选择是否指定数据库和架构名称。

 object_type 
架构范围的对象类型。object_type 的数据类型为 varchar 或 nvarchar。如果 object_type 的数据类型为 varchar,则它将隐式转换为 nvarchar。有关对象类型的列表,请参阅 sys.objects
(Transact-SQL) 中的 type 列。

返回类型 :int

必发88手机客户端 2异常:

 

对于空间索引,OBJECT_ID 返回 NULL。

出现错误时,返回 NULL。

用户只能查看其拥有的安全对象的元数据,或者已对其授予权限的安全对象的元数据。也就是说,如果用户对该对象没有任何权限,则某些会产生元数据的内置函数(如
OBJECT_ID)可能返回
NULL。有关详细信息,请参阅 元数据可见性配置和 元数据可见性故障排除。

必发88手机客户端 3

注释 :

 

当该参数对系统函数可选时,则系统采用当前数据库、主机、服务器用户或数据库用户。内置函数后面必须跟圆括号。

当指定临时表名时,除非当前数据库为 tempdb,否则必须在该临时表名之前加上数据库名称。例如:SELECT OBJECT_ID('tempdb..#mytemptable')

系统函数可以在选择列表、WHERE
子句和任何允许使用表达式的地方使用。有关详细信息,请参阅 表达式(Transact-SQL)和 WHERE
(Transact-SQL)。

 

分类: 数据库

该查询返回不正确的结果,因为视图vEmployee不在主数据库中。

1 USE master;  
2 GO  
3 SELECT OBJECTPROPERTY(OBJECT_ID(N'AdventureWorks2012.HumanResources.vEmployee'), 'IsView');  
4 GO 

OBJECTPROPERTY(view_id,’IsIndexable’)可能会消耗重要的计算机资源,因为IsIndexable属性的评估需要解析视图定义,规范化和部分优化。

虽然IsIndexable属性标识可以进行索引的表或视图,但是如果不满足某些索引关键要求,索引的实际创建仍然可能会失败。

当添加表的至少一列进行索引时,OBJECTPROPERTY(table_id,’TableHasActiveFulltextIndex’)将返回值为1(true)。

只要添加第一列进行索引,全文索引就会变得活跃。

创建表时,即使在创建表时该选项设置为OFF,QUOTED
IDENTIFIER选项始终作为ON存储在表的元数据中。

因此,OBJECTPROPERTY(table_id,’IsQuotedIdentOn’)将始终返回值1(true)。

示例:

 1 -- 验证 dbo.Department 是否是一个表
 2 IF (OBJECTPROPERTY (OBJECT_ID(N'dbo.Department'),'ISTABLE') = 1)
 3 begin
 4     select 'Department 是一个表'
 5 end
 6 ELSE IF (OBJECTPROPERTY (OBJECT_ID(N'dbo.Department'),'ISTABLE') = 0)
 7 begin
 8     select 'Department 不是一个表'
 9 end
10 ELSE IF (OBJECTPROPERTY (OBJECT_ID(N'dbo.Department'),'ISTABLE') IS NULL)
11 begin
12     select 'Department 不是一个有效的对象'
13 end
14 GO

 

1 -- 验证 自定义 的标量函数 是否 是确定性的
2 SELECT OBJECTPROPERTY(OBJECT_ID('dbo.AvgHeight'), 'IsDeterministic');    --返回 0  表示不确定

 

1 --使用 SchemaId 属性返回所有者 dbo 的所有对象
2 SELECT name, object_id, type_desc  
3 FROM sys.objects   
4 WHERE OBJECTPROPERTY(object_id, N'SchemaId') = SCHEMA_ID(N'dbo')  
5 ORDER BY type_desc, name;--使用 SchemaId 属性返回所有者 dbo 的所有对象
6 SELECT name, object_id, type_desc  
7 FROM sys.objects   
8 WHERE OBJECTPROPERTY(object_id, N'SchemaId') = SCHEMA_ID(N'dbo')  
9 ORDER BY type_desc, name;

 

 1 -- 验证表 Department 是否 是用户自定义的表
 2 IF (OBJECTPROPERTY (OBJECT_ID(N'dbo.Department'),'IsUserTable') = 1)
 3 begin
 4    SELECT 'Department 是用户自定义的表'  
 5 end
 6 ELSE   
 7 begin
 8    SELECT 'Department 不是用户自定义的表';  
 9 end
10 GO 

 

参考: