SQL Server 2000 基础——系统函数 (转帖)

本文详细介绍了SQL Server中的系统函数,包括查看服务器信息、登录和用户信息、属性信息等,并对比了标识属性相关的函数,如SCOPE_IDENTITY()、@@IDENTITY、IDENT_CURRENT()的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、系统函数

1、查看信息

1.1、查看编号和名称

select @@SERVERNAME

--SQL SERVER服务器的连接字符串,如:computername/instancename

select @@SERVICENAME

--若为默认实例,则返回MSSQLSERVER;若是命名实例,则返回实例名

改变机器名称后,实例的名称也会跟着变。但是之后会导致本机的内部实例名会跟网络服务名不一致,解决办法如下:

select @@SERVERNAME, SERVERPROPERTY('ServerName')

 

if serverproperty('servername')<>@@servername  

begin  

    declare @server sysname  

    set @server=@@servername  

    exec sp_dropserver @server=@server

--删除这个服务器注册

    set @server=cast(serverproperty('servername') as sysname)  

    exec sp_addserver @server=@server,@local='LOCAL'

--添加当前改过名的服务器注册

end

 

select HOST_ID() --主机编号

select HOST_NAME()--主机名

select DB_ID('master') --数据库编号

select DB_NAME(1)      --数据库名称

select OBJECT_ID('sysobjects')  --数据库对象编号

在临时表上用object_id()时,要在临时表前加数据库名

如下:

方法1(错误)

--#temp不是存在当前数据库中的

select object_ID('#temp')

方法2(错误)

--是存在tempdb中,但temdb中没有这个函数

use tempdb

select object_ID('#temp')

方法3(正确)

--MSQL的临时表是存在tempdb中的

select object_ID('tempdb..#temp')

select OBJECT_NAME(1)           --数据库对象名称

select File_ID('master')        --返回该逻辑文件名的编号

select File_NAME(1)              --返回该文件编号的逻辑文件名

select FILEGROUP_ID('primary')     --返回文件组编号

select FILEGROUP_NAME(1)           --返回文件组名称

 

select COL_NAME(OBJECT_ID('sysobjects'),1)

--表中列的名称,每个表中列是从…n顺序编号

select INDEX_COL('sysobjects',1,1)   

--返回sysobjects中第一个索引第一个键的名称

 

select APP_NAME() --返回当前使用的工具名称,如:SQL 查询分析器

select @@SPID      --返回当前连接在SQL SERVER中的编号

select @@PROCID    --在SP中使用,查看自己的ID

 

1.2、查看登录和用户

select Suser_Sid()      --返回登录的SID,可传参,默认返回当前值

select Suser_Sname()    --返回登录的名称,可传参,默认返回当前值

select System_User      --等价于不带参数的SUER_SNAME()

 

select User_Id()          --返回数据库用户ID,可传参,默认返回当前值

select User_Name()       --返回数据库用户名,可传参,默认返回当前值

select User                --等价于不带参数的USER_NAME()

select Current_User      --等价于不带参数的USER_NAME()

select Session_User      --等价于不带参数的USER_NAME()

 

1.3、查看属性

select Serverproperty('Collation')               --查看服务器的属性

select Databasepropertyex('master','Collation')  --查看数据库的属性

select Sessionproperty('ANSI_NULLS')              --查看当前会话的SET选项  

select Objectproperty(1,'IsTable')               --查看当前对象的信息

select Filegroupproperty('Primary','IsReadOnly') --查看文件组的属性

select Fileproperty('master','SpaceUsed')        --查看文件的属性

select Columnproperty(1,'name','AllowsNull')      --查看列属性

select Indexproperty(1,'ncsysobjects','IsClustered') --查看索引属性

select Indexkey_Property(1,2,1,'ColumnId')           --查看索引键信息

 

select Collationproperty('Chinese_PRC_CI_AS','LCID')

--查看排序规则的信息

select Sql_Variant_Property('abc12345','BaseType')  

--返回sql_variant类型值的信息

 

2、NULL相关的

select COALESCE(null,'first',null,'second',null)

--返回众多表达式中第一个非NULL 表达式的值

select NULLIF('123','123')

--在expression1 与expression2 相等时返回NULL 值若不相等时则返回expression1 的值

select ISNULL(null,'not null value')

--使用指定的替换值替换NULL

select GetANSINull('master')

--查看SET ANSI_NULL_DFLT_ON 的设置

 

3、字符相关

3.1、获取长度

select DATALENGTH('s我s') --返回表达式占用的字节数

select COL_LENGTH('sysobjects','name') --返回列的定义长度(byte)

 

3.2、返回有效的 SQL Server 分隔标识符

SELECT QUOTENAME('abc[]def')

--结果集:[abc[]]def],]]类似于''两个表示一个

--该函数对于SQL注入的防护非常有效,各种前台开发工具也有类似函数

 

3.3、加密syscomments中的字符内容

select encrypt('原文') --未公开的函数,syscomments中的ctext即用此加密

 

3.4、加密sysxlogins中的登陆密码

select pwdencrypt('原文') --未公开的函数,sysxlogins中的password即用此加密

select pwdcompare('原文','密文') = 1--相同;否则不相同

 

3.5、校验和函数

if (select checksum_agg(binary_checksum(*)) from A)

=(select checksum_agg(binary_checksum(*)) from B)

    print '相等'

else

    print '不相等'

--此处binary_checksum()也可以换成checksum(),只是算法不同而已,效果一样

4、日期时间

4.1、日期时间转换为字符串

select convert(varchar(20),getdate(),23)

--转换为纯日期,格式如:2007-12-18,BOL无记载

select convert(varchar(20),getdate(),24)

--转换为纯时间,格式如:22:19:20,BOL无记载

 

4.2、计算日期时间

通常, 我们把日期进行分割,然后利用分割出来的年、月、日等计算或组合出自己所需要的日期,下面的例子巧妙利用0即1900-01-01 00:00:00.000作为基准进行日期计算。

其中设置@@DATEFIRST为7,即星期天是一周的第一天。

 

--本年的第一天,当前日期与0相差的年数再加给0,默认为1号

Select DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

--本季的第一天,当前日期与0相差的季数再加给0,默认为1号

Select DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

--本月的第一天,当前日期与0相差的月数再加给0,默认为1号

Select DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

--本周的星期一,当前日期与0相差的周数再加给0,默认为1,星期到星期天的值为1-7

--datepart(dw,getdate())中的返回值表示当前日为一星期中的第几天

Select DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

--今天的第一秒,当前日期与0相差的天数再加给0,默认时间为0点

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

 

--去年的最后一天,本年第一天减掉3ms,在Sql Server中datetime是精确到3ms

Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

--上个月的最后一天,本月第一天减掉3ms

Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

--本年的最后一天,明年第一天减掉3ms

Select dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

--本月的最后一天,下个月第一天减掉3ms

Select dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

--本月的第一个星期一,以本月第6天与0作差

select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

4.3、当前日期

CURRENT_TIMESTAMP等同于getdate(),返回类型都为datetime

--与getdate()一样,在函数中也是无法使用

 

5、标识属性相关

先讲一个概念问题,identity属性与identity函数的区别,前者是列的属性,后者是一个只可用于select into语句的函数,用于生成序号,使用如下:

select identity(int, 1, 1) as Ordinal into newtable from oldtable

 

SQL Server 中,可以使用SCOPE_IDENTITY()、@@IDENTITY 、IDENT_CURRENT() 来取得最后插入记录的值值,它们的区别在于:

 

 SCOPE_IDENTITY()和@@IDENTITY 都将返回在当前会话的所有表中生成的最后一个标识值,但是,SCOPE_IDENTITY 只在当前作用域内返回值,而@@IDENTITY 不限于特定的作用域。一个作用域就是一个模块——存储过程、触发器、函数或批处理。

也就是说:SCOPE_IDENTITY()只返回当前所运行的insert返回的标识值,对于由当前insert所触发的insert产生的标识值不作返回,在一些强并发的OLTP系统或存在触发器的系统中,往往因为数据库开发人员使用了@@IDENTITY来捕获标识值,会得到比预期标识值大或小的值;

 

IDENT_CURRENT() 返回的是任何会话和任何作用域中的指定表最后生成的标识值。

-- 创建测试表

CREATE TABLE t1(id int IDENTITY,col int)

INSERT t1

    SELECT 1

    UNION ALL

    SELECT 2

CREATE TABLE t2(id int IDENTITY,col int)

 

CREATE TRIGGER TR_insert_t2 ON t2

FOR INSERT

AS

INSERT t1 SELECT 3

 

-- 测试一,当前连接

INSERT t2 VALUES(1)

SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),

    [@@IDENTITY]=@@IDENTITY,

    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),

    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')

-- 测试二,当前连接

INSERT t1 VALUES(10)

SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),

    [@@IDENTITY]=@@IDENTITY,

    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),

    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')

-- 测试三,开启一个新连接

SELECT [SCOPE_IDENTITY()]=SCOPE_IDENTITY(),

    [@@IDENTITY]=@@IDENTITY,

    [IDENT_CURRENT() For t1]=IDENT_CURRENT(N't1'),

    [IDENT_CURRENT() For t2]=IDENT_CURRENT(N't2')

-- 删除测试表

DROP TABLE t1,t2

 

可以看出:

IDENT_CURRENT()  始终返回指定表最后的标识值

@@IDENTITY       始终返回当前会话最后的标识值,无论是否在同一个作用域,在测试1、2中,可以看到它返回的是触发器中插入记录的标识值,而在测试3中,因为当前会话无插入记录,所以返回NULL

SCOPE_IDENTITY() 始终返回当前会话同一作用域的标识值,所以在测试1、2中,它返回的值不受触发器的影响,而在测试3中,因为当前会话无插入记录,所以返回NULL

二、系统自定义函数


系统自定义函数都保存在master数据库中以fn开头,调用时from后面加二个冒号(::),不需要指定所有者,如下:

SELECT * FROM ::fn_helpcollations() --系统所支持的所有的语言

select * from ::fn_trace_gettable('c:/trace_file.trc', default)

--跟踪文件可以通过Profiler工具或运行系统的存储过程sp_trace_create建立

事实上很多系统自定义函数只是简单的调用一个扩展存储过程。


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/seusoftware/archive/2009/01/15/3792129.aspx

 

好好好强大。。。 - 。-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值