SQL Server中的OBJECTPROPERTY函数使用

返回当前数据库中对象的有关信息。

语法

OBJECTPROPERTY ( id , property )

参数

id

一个表达式,包含当前数据库中某个对象的 ID。id 的数据类型是 int

Property

一个表达式,包含针对由 id 指定的对象将要返回的信息。Property 可以是下面这些值中的一个。

 

说明   除非加以注释,否则,如果 property 是无效的属性名,则返回 NULL。

 

属性名称对象类型描述和返回的值
CnstIsClustKey约束带有聚集索引的主键。

1 = True
0 = False

CnstIsColumn约束COLUMN 约束。

1 = True
0 = False

CnstIsDeleteCascade约束带有 ON DELETE CASCADE 选项的外键约束。
CnstIsDisabled约束禁用的约束。

1 = True
0 = False

CnstIsNonclustKey约束带有非聚集索引的主键。

1 = True
0 = False

CnstIsNotTrusted约束启用约束时未检查现有行,所以可能不是所有行都受约束的控制。

1 = True
0 = False

CnstIsNotRepl约束使用 NOT FOR REPLICATION 关键字定义约束。
CnstIsUpdateCascade约束带有 ON UPDATE CASCADE 选项的外键约束。
ExecIsAfterTrigger触发器AFTER 触发器。
ExecIsAnsiNullsOn过程、触发器、视图创建时的 ANSI_NULLS 设置。

1 = True
0 = False

ExecIsDeleteTrigger触发器DELETE 触发器。

1 = True
0 = False

ExecIsFirstDeleteTrigger触发器对表执行 DELETE 时触发的第一个触发器。
ExecIsFirstInsertTrigger触发器对表执行 INSERT 时触发的第一个触发器。
ExecIsFirstUpdateTrigger触发器对表执行 UPDATE 时触发的第一个触发器。
ExecIsInsertTrigger触发器INSERT 触发器。

1 = True
0 = False

ExecIsInsteadOfTrigger触发器INSTEAD OF 触发器。
ExecIsLastDeleteTrigger触发器对表执行 DELETE 时触发的最后一个触发器。
ExecIsLastInsertTrigger触发器对表执行 INSERT 时触发的最后一个触发器。
ExecIsLastUpdateTrigger触发器对表执行 UPDATE 时触发的最后一个触发器。
ExecIsQuotedIdentOn过程、触发器、视图创建时的 QUOTED_IDENTIFIER 设置。

1 = True
0 = False

ExecIsStartup过程启动过程。

1 = True
0 = False

ExecIsTriggerDisabled触发器禁用的触发器。

1 = True
0 = False

ExecIsUpdateTrigger触发器UPDATE 触发器。

1 = True
0 = False

HasAfterTrigger表,视图表或视图具有 AFTER 触发器。

1 = True
0 = False

HasInsertTrigger表,视图表或视图具有 INSERT 触发器。

1 = True
0 = False

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

1 = True
0 = False

HasUpdateTrigger表、视图表或视图具有 UPDATE 触发器。

1 = True
0 = False

IsAnsiNullsOn函数、过程、表、触发器、视图指定表的 ANSI NULLS 选项设置为 ON,表示所有与空值的比较都取值为 UNKNOWN。只要表存在,该设置就应用于表定义中的所有表达式,包括计算列和约束。

1 = ON
0 = OFF

IsCheckCnst任何CHECK 约束。

1 = True
0 = False

IsConstraint任何约束。

1 = True
0 = False

IsDefault任何绑定的默认值。

1 = True
0 = False

IsDefaultCnst任何DEFAULT 约束。

1 = True
0 = False

IsDeterministic函数、视图函数的确定性属性。只适用于标量值及表值函数。

1 = 可确定的
0 = 不可确定的
NULL = 不是标量值或表值函数,或者是无效的对象 ID。

IsExecuted任何指定执行该对象的方式(视图、过程或触发器)。

1 = True
0 = False

IsExtendedProc任何扩展过程。

1 = True
0 = False

IsForeignKey任何FOREIGN KEY 约束。

1 = True
0 = False

IsIndexed表、视图带有索引的表或视图。
IsIndexable表、视图可以创建索引的表或视图。
IsInlineFunction函数内嵌函数。

1 = 内嵌函数
0 = 非内嵌函数
NULL = 不是函数,或者是无效的对象 ID。

IsMSShipped任何在安装 Microsoft® SQL Server™ 2000 的过程中创建的对象。

1 = True
0 = False

IsPrimaryKey任何PRIMARY KEY 约束。

1 = True
0 = False

IsProcedure任何过程。

1 = True
0 = False

IsQuotedIdentOn函数、过程、表、触发器、视图指定表的被引用标识符设置为 ON,表示在表定义所涉及的所有表达式中,双引号标记分隔标识符。

1 = ON
0 = OFF

IsReplProc任何复制过程。

1 = True
0 = False

IsRule任何绑定的规则。

1 = True
0 = False

IsScalarFunction函数标量值函数。

1 = 标量值
0 = 表值
NULL = 不是函数,或者是无效的对象 ID。

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

1 = 架构绑定
0 = 非架构绑定
NULL = 不是函数或视图,或者是无效的对象 ID。

IsSystemTable系统表。

1 = True
0 = False

IsTable表。

1 = True
0 = False

IsTableFunction函数表值函数。

1 = 表值
0 = 标量值
NULL = 不是函数,或者是无效的对象 ID。

IsTrigger任何触发器。

1 = True
0 = False

IsUniqueCnst任何UNIQUE 约束。

1 = True
0 = False

IsUserTable用户定义的表。

1 = True
0 = False

IsView视图视图。

1 = True
0 = False

OwnerId任何对象的所有者。

Nonnull = 对象所有者的数据库用户 ID。
NULL = 无效的输入。

TableDeleteTrigger表有 DELETE 触发器。

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

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

>1 = 给定类型的第一个触发器的 ID。
NULL = 无效的输入。

TableFullTextBackgroundUpdateIndexOn表已启用全文后台更新索引。

1 = True
0 = False

TableFulltextCatalogId表的全文索引数据所驻留的全文目录的 ID。

Nonzero = 全文目录 ID,它与标识全文索引表中行的唯一索引相关。
0 = 表不是全文索引的。

TableFullTextChangeTrackingOn表已启用全文更改跟踪。

1 = True
0 = False

TableFulltextKeyColumn与某个单列唯一索引相关联的列 ID,这个单列唯一索引参与全文索引定义。

0 = 表不是全文索引的。

TableFullTextPopulateStatus0 = 不填充
1 = 完全填充
2 = 增量填充
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
NULL = 无效的输入。

TableHasNonclustIndex表具有非聚集索引。

1 = True
0 = False

TableHasPrimaryKey表具有主键。

1 = True
0 = False

TableHasRowGuidCol对于 uniqueidentifier 列,表具有 ROWGUIDCOL。

1 = True
0 = False

TableHasTextImage表具有 text 列。

1 = True
0 = False

TableHasTimestamp表具有 timestamp 列。

1 = True
0 = False

TableHasUniqueCnst表具有 UNIQUE 约束。

1 = True
0 = False

TableHasUpdateTrigger对象具有 Update 触发器。

1 = True
0 = False

TableInsertTrigger表具有 INSERT 触发器。

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

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

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

TableIsFake表不是真实的。根据需要 SQL Server 对其进行内部具体化。

1 = True
0 = False

TableIsPinned驻留表以将其保留在数据高速缓存中。

1 = True
0 = False

TableTextInRowLimittext in row 所允许的最大字节数,如果没有设置 text in row 选项则为 0。
TableUpdateTrigger表具有 UPDATE 触发器。

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

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

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

 

返回类型

int

注释

OBJECTPROPERTY(view_id,'IsIndexable') 可能会耗费大量的计算机资源,这是因为对 IsIndexable 属性的评估需要分析视图定义、进行规范化以及部分优化。

当至少添加了表的一列以用于索引时,OBJECTPROPERTY(table_id, 'TableHasActiveFulltextIndex') 将返回"1"(True)。只要添加了用于索引的第一列后,全文索引即可用于填充。

当除去索引中的最后一列时,索引变成非活动。

如果某些索引键需求条件得不到满足,那么实际创建索引仍然可能会失败。详细信息请参见 CREATE INDEX。

示例
A. 查明 authors 是否为一个表

下面的示例测试 authors 是否为一个表。

IF OBJECTPROPERTY ( object_id('authors'),'ISTABLE') = 1
   print 'Authors is a table'

ELSE IF OBJECTPROPERTY ( object_id('authors'),'ISTABLE') = 0
   print 'Authors is not a table'

ELSE IF OBJECTPROPERTY ( object_id('authors'),'ISTABLE') IS NULL
   print 'ERROR: Authors is not an object'
B. 确定是否在表上启用了 text in row

下面的示例测试是否在 authors 表上启用了 text in row 选项,以便 textntextimage 数据可以存储在它的数据行内。

USE pubs
SELECT OBJECTPROPERTY(OBJECT_ID('authors'),'TableTextInRowLimit')

结果集显示在表上没有启用 text in row

-----
0
C. 确定用户定义的标量值函数是否具有确定性

下面的示例测试用户定义的标量值函数 fn_CubicVolume 是否具有确定性,该函数返回小数。

CREATE FUNCTION fn_CubicVolume
-- Input dimensions in centimeters.
   (@CubeLength decimal(4,1), @CubeWidth decimal(4,1),
   @CubeHeight decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
WITH SCHEMABINDING
AS
BEGIN
   RETURN ( @CubeLength * @CubeWidth * @CubeHeight )
END

--Is it a deterministic function?
SELECT OBJECTPROPERTY(OBJECT_ID('fn_CubicVolume'), 'IsDeterministic')

结果集显示 fn_CubicVolume 是确定性函数。

-----
1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
--计算当前月的实际天数 Create FUNCTION dbo.CalcDaysOfMonth (@time varchar(6)) RETURNS int AS BEGIN DECLARE @Days int DECLARE @Month int DECLARE @Year int SET @Year=SUBSTRING(@time,1,4) SET @Month=SUBSTRING(@time,5,6) if( @Month='1' OR @Month='3' OR @Month='5' OR @Month='7' OR @Month='8' OR @Month='10' OR @Month='12' ) set @Days=31 else if( @Month='4' OR @Month='6' OR @Month='9' OR @Month='11' ) set @Days=30; else if(@Year%400=0 OR (@Year%4=0 AND @Year%100<>0)) set @Days=29 else set @Days=28 RETURN(@Days) END --确定某年某月有多少天 Create FUNCTION DaysInMonth ( @date datetime ) Returns int AS BEGIN RETURN Day(dateadd(mi,-3,DATEADD(m, DATEDIFF(m,0,@date)+1,0))) END --哪一天是输入时间的星期一 Create FUNCTION MondayInDate ( @date datetime ) RETURNS DATETIME AS BEGIN RETURN DATEADD(week, DATEDIFF(week,0,@date),0) END --输入时间的季度的第一天 Create FUNCTION QuarterInDate ( @date datetime ) RETURNS DATETIME AS BEGIN RETURN DATEADD(quarter, DATEDIFF(quarter,0,@date), 0) END --输入时间的季度的天数 Create FUNCTION QuarterDaysInDate ( @date datetime ) RETURNS INT AS BEGIN declare @m tinyint,@time SMALLDATETIME select @m=month(@date) select @m=case when @m between 1 and 3 then 1 when @m between 4 and 6 then 4 when @m between 7 and 9 then 7 else 10 end select @time=datename(year,@date)+'-'+convert(varchar(10),@m)+'-01' return datediff(day,@time,dateadd(mm,3,@time)) END --按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串存在多少个分隔符号,然后再加一,就是要求的结果。 Create function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int set @str=ltrim(rtrim(@str)) set @location=charindex(@split,@str) set @length=1 while @location<>0 begin set @start=@location+1 set @location=charindex(@split,@str,@start) set @length=@length+1 end return @length END --按指定符号分割字符串,返回分割后指定索引的第几个元素,象数组一样方便 Create function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(1024) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) END select dbo.Get_StrArrayStrOfIndex('8,9,4','',4) --结合上边两个函数,象数组一样遍历字符串的元素 create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(100)) returns @temp table(F1 varchar(100)) as begin declare @ch as varchar(100) set @SourceSql=@SourceSql+@StrSeprate while(@SourceSql<>'') begin set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1) insert @temp values(@ch) set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'') end return end select * from dbo.f_splitstr('1,2,3,4',',') --全角和半角转换函数 Create FUNCTION f_Convert( @str NVARCHAR(4000), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )RETURNS nvarchar(4000) AS BEGIN DECLARE @pat nvarchar(8),@step int,@i int,@spc int IF @flag=0 Select @pat=N'%[!-~]%',@step=-65248, @str=REPLACE(@str,N' ',N' ') ELSE Select @pat=N'%[!-~]%',@step=65248, @str=REPLACE(@str,N' ',N' ') SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str) WHILE @i>0 Select @str=REPLACE(@str, SUBSTRING(@str,@i,1), NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step)) ,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str) RETURN(@str) END GO declare @s1 varchar(8000) select @s1='  2-3456a78STUVabn国opwxyz' select dbo.f_convert(@s1,0),dbo.f_convert(@s1,1) 函数返回值是表 create table test(id int primary key,name char(10)) insert into test values(1,'test1') insert into test values(2,'test2') insert into test values(3,'test3') insert into test values(4,'test4') 1、标量函数 create function return_count() returns int as begin declare @count int select @count=count(*) from test return @count end --调用 select dbo.return_count() cont --count为显示的列头 --运行结果 --count --4 2、内嵌表值函数 create function return_test() returns table as --begin 内联表值函数不能用begin-end return select name from test --end --调用 select * from return_test() --运行结果 --name --test1 --test2 --test3 --test4 3、多语句表值函数 create function return_test_multi() returns @temp table(id int,name char(10)) as begin insert into @temp select * from test where id in(1,2) return --记住,一定不要忘记写return end --调用 select * from dbo.return_test_multi() --运行结果 --id name --1 test1 --2 test2 在查询结果增加一个自动增长的ID select id=identity(int, 1, 1), * into #T from testTable select * from #T drop table #T sql删除重复的记录 打开测试数据库test,并以表w01为例,将下面的SQL语句放入sql2000查询分析器,一段一段执行即可看到效果 ---在sql2000下创建测试数据表 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[w01]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[w01] ---在sql2005下创建测试数据表,如果是sql2005则用本段来判断数据表是否存在 ---if exists(select 1 from sys.tables where name='w01') ---drop table w01 ----开始创建测试数据库 GO create table w01(gs903 varchar(32),gs1002 varchar(32)) insert into w01 select '1','a' union all select '1','a' union all select '1','a' union all select '2','a' union all select '2','e' union all select '3','b' union all select '3','d' go select * from w01 go ---为表w01添加一个可以表示唯一标示的自增字段ID alter table w01 add [ID] [int] IDENTITY (1, 1) NOT FOR REPLICATION NOT NULL ---查询删除前的数据和记录数:7 select * from w01 select count(*) from w01 ---查询具有重复记录的所有记录;3 select gs903,gs1002,count(*) as count from w01 group by gs903,gs1002 having count(*)>1 order by count desc ---删除重复的数据:2行 delete from w01 where id not in (select max(id) from w01 group by gs903,gs1002) ---看看删除后还有没有重复记录:0 select gs903,gs1002,count(*) as count from w01 group by gs903,gs1002 having count(*)>1 order by count desc ---删除后的数据和记录数:7-2=5 select * from w01 select count(*) from w01 用SQL语句添加删除修改字段 增加字段 alter table docdsp add dspcode char(200) 删除字段 Alter TABLE table_NAME Drop COLUMN column_NAME 修改字段类型 Alter TABLE table_name Alter COLUMN column_name new_data_type 改名 sp_rename 更改当前数据库用户创建对象(如表、列或用户定义数据类型)的名称。 语法 sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object_type' ] --假设要处理的表名为: tb --判断要添加列的表是否有主键 if exists(select 1 from sysobjects where parent_obj=object_id('tb') and xtype='PK') begin print '表已经有主键,列只能做为普通列添加' --添加int类型的列,默认值为0 alter table tb add 列名 int default 0 end else begin print '表无主键,添加主键列' --添加int类型的列,默认值为0 alter table tb add 列名 int primary key default 0 end

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值