sqlserver sql常用函数,语法
--
返回一个表中所有的字段
select name from syscolumns where id = object_id ( ' tb_usertable_online ' )
-- 获取最近添加的标识列的值
set @rs = @@identity
--
print len ( ' abcdef ' )
-- 大小写转换
print lower ( ' ABCDEF ' )
print upper ( ' abcdef ' )
-- 去空格
print ltrim ( ' abcd dfd df ' )
print rtrim ( ' abcd dfd df ' )
-- 求绝对值
print abs ( - 12 )
-- 幂
-- 3 的 2 次方
print power ( 3 , 2 )
print power ( 3 , 3 )
-- 随机数
-- 0 - 1000 之间的随机数
print convert ( int , rand () * 10 )
-- 获取圆周率
print pi ()
-- 获取系统时间
print getdate ()
-- 获取3天前的时间
print dateadd ( day , - 3 , getdate ())
-- 获取3天后的时间
print dateadd ( day , 3 , getdate ())
-- 获取3年前的时间
print dateadd ( year , - 3 , getdate ())
-- 获取3年后的时间
print dateadd ( year , 3 , getdate ())
-- 获取3月后的时间
print dateadd ( month , 3 , getdate ())
-- 获取9小时后的时间
print dateadd (hour, 9 , getdate ())
-- 获取9分钟后的时间
print dateadd (minute, 9 , getdate ())
-- 获取指定时间之间相隔多少年
print datediff ( year , ' 2005-01-01 ' , ' 2008-01-01 ' )
-- 获取指定时间之间相隔多少月
print datediff ( month , ' 2005-01-01 ' , ' 2008-01-01 ' )
-- 获取指定时间之间相隔多少天
print datediff ( day , ' 2005-01-01 ' , ' 2008-01-01 ' )
-- 字符串合并
print ' abc ' + ' def '
print ' abcder '
print ' abc ' + ' 456 '
print ' abc ' + 456
-- 类型转换
print ' abc ' + convert ( varchar ( 10 ), 456 )
select title_id, type, price from titles
-- 字符串连接必须保证类型一致(以下语句执行将会出错)
-- 类型转换
select title_id + type + price from titles
-- 正确
select title_id + type + convert ( varchar ( 10 ), price) from titles
print ' 123 ' + convert ( varchar ( 3 ), 123 )
print ' 123 ' + ' 123 '
-- 是否可以定义一个函数
-- 将作者编号作为参数统计其作品数量并将其返回
select au_id, au_lname, dbo.GetTitleCountByAuID(au_id) as TitleCount
from authors
order by TitleCount
-- 根据给定的作者编号获取其相应的作品数量
create function GetTitleCountByAuID( @au_id varchar ( 12 ))
returns int
begin
return ( select count (title_id)
from titleauthor
where au_id = @au_id )
end
-- 查看表结构
sp_help titles
-- 查看存储过程的定义内容
sp_helptext GetRankByTitleId
sp_helptext sp_helptext
sp_helptext xp_cmdshell
-- 声明
declare cur_titles cursor
for select title, price from titles
-- 打开
open cur_titles
declare @title varchar ( 80 )
declare @price numeric( 9 , 4 )
declare @title_temp varchar ( 80 )
declare @price_temp numeric( 9 , 4 )
-- 提取
fetch cur_titles into @title , @price
fetch cur_titles into @title_temp , @price_temp
while @@fetch_status = 0
begin
if @price < @price_temp
begin
set @price = @price_temp
set @title = @title_temp
end
fetch cur_titles into @title_temp , @price_temp
end
-- 关闭
close cur_titles
-- 释放
deallocate cur_titles
假设有张学生成绩表(CJ)如下
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82
想变成
姓名 语文 数学 物理
张三 80 90 85
李四 85 92 82
declare @sql varchar ( 4000 )
set @sql = ' select Name '
select @sql = @sql + ' ,sum(case Subject when ''' + Subject + ''' then Result end) [ ' + Subject + ' ] '
from ( select distinct Subject from CJ) as a
select @sql = @sql + ' from test group by name '
exec ( @sql )
2 . 行列转换 -- 合并
有表A,
id pid
1 1
1 2
1 3
2 1
2 2
3 1
如何化成表B:
id pid
1 1 , 2 , 3
2 1 , 2
3 1
创建一个合并的函数
create function fmerg( @id int )
returns varchar ( 8000 )
as
begin
declare @str varchar ( 8000 )
set @str = ''
select @str = @str + ' , ' + cast (pid as varchar ) from 表A where id = @id set @str = right ( @str , len ( @str ) - 1 )
return ( @str )
End
go
-- 调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A
查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = ' 表名 '
3 .取回表中字段:
declare @list varchar ( 1000 ), @sql nvarchar ( 1000 )
set @list = ''
-- set @sql = ''
select @list = @list + ' , ' + b.name from sysobjects a,syscolumns b where a.id = b.id and a.name = ' tb_user_msg '
set @sql = ' select ' + right ( @list , len ( @list ) - 1 ) + ' from tb_user_msg '
-- print @sql
exec sp_ExecuteSql @sql
4 .查看硬盘分区:
EXEC master..xp_fixeddrives
5 .比较A,B表是否相等:
if ( select checksum_agg(binary_checksum( * )) from A)
=
( select checksum_agg(binary_checksum( * )) from B)
print ' 相等 '
else
print ' 不相等 '
6 .杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR Select ' kill ' + RTRIM (spid) FROM master.dbo.sysprocesses
Where program_name IN ( ' SQL profiler ' ,N ' SQL 事件探查器 ' )
EXEC sp_msforeach_worker ' ? '
10 :获取某一个表的所有字段
select name from syscolumns where id = object_id ( ' 表名 ' )
11 :查看与某一个表相关的视图、存储过程、函数
select a. * from sysobjects a, syscomments b where a.id = b.id and b. text like ' %表名% '
9 :获取当前数据库中的所有用户表
select Name from sysobjects where xtype = ' u ' and status >= 0
12 :查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype = ' P '
14 :查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = ' 表名 '
SQL字符函数:
返回字符串中从左边开始指定个数的字符。 LEFT ( character_expression , integer_expression )
Select LEFT (Name, 5 ) FROM Production.Product orDER BY ProductID;
RIGHT :返回字符表达式中从起始位置(从右端开始)到指定字符位置(从右端开始计数)的部分。
RIGHT (character_expression,integer_expression)
RIGHT ("Mountain Bike", 4 ) 返回结果Bike
LEN :返回给定字符串表达式的字符数(不包括尾随空格),而不是返回字节数。
LEN ( string_expression )
Select CompanyName, LEN (CompanyName)
FROM Customers
REPLICATE :按指定次数重复字符表达式。
REPLICATE ( character_expression, integer_expression)
下面的示例将 Employee 表中每一名雇员的姓氏复制两次:
Select REPLICATE (LastName, 2 ) AS "LastName Twice"
FROM Employees
SUBSTRING :返回 $sourceString 的子串,从 $startingLoc 指定的位置开始,长度为 $length 指定的字符数。 SUBSTRING ( expression, start, length )
下面的示例返回 Employees 表中每位雇员的名字首字母及完整姓氏:
Select SUBSTRING (First Name, 1 , 1 ) AS Initial, Last Name
FROM Employees
STUFF :删除指定长度的字符并在指定的起始点插入另一组字符。 -- 替换
STUFF ( character_expression, start, length, character_expression )
Select STUFF (ProductID, 2 , 1 , ' 000 ' )
FROM Products
PATINDEX :对于所有有效的文本和字符数据类型,返回指定表达式中模式第一次出现的起始位置,如果未找到模式,则返回零。
PATINDEX ( ' %pattern% ' , expression )
下面的示例搜索其名称包含单词“Anton”的产品的列表。
Select ProductName, PATINDEX ( ' %Anton% ' , ProductName)
FROM Products
CHARINDEX :返回字符串中指定表达式的起始位置。
CHARINDEX ( expression1 , expression2 [ , start_location ] )
下面的示例从数据库中的员工姓氏中搜索表达式“an”:
Select [ Last Name ] , CHARINDEX ( ' an ' , [ Last Name ] ) AS Position
FROM Employees
select name from syscolumns where id = object_id ( ' tb_usertable_online ' )
-- 获取最近添加的标识列的值
set @rs = @@identity
--
print len ( ' abcdef ' )
-- 大小写转换
print lower ( ' ABCDEF ' )
print upper ( ' abcdef ' )
-- 去空格
print ltrim ( ' abcd dfd df ' )
print rtrim ( ' abcd dfd df ' )
-- 求绝对值
print abs ( - 12 )
-- 幂
-- 3 的 2 次方
print power ( 3 , 2 )
print power ( 3 , 3 )
-- 随机数
-- 0 - 1000 之间的随机数
print convert ( int , rand () * 10 )
-- 获取圆周率
print pi ()
-- 获取系统时间
print getdate ()
-- 获取3天前的时间
print dateadd ( day , - 3 , getdate ())
-- 获取3天后的时间
print dateadd ( day , 3 , getdate ())
-- 获取3年前的时间
print dateadd ( year , - 3 , getdate ())
-- 获取3年后的时间
print dateadd ( year , 3 , getdate ())
-- 获取3月后的时间
print dateadd ( month , 3 , getdate ())
-- 获取9小时后的时间
print dateadd (hour, 9 , getdate ())
-- 获取9分钟后的时间
print dateadd (minute, 9 , getdate ())
-- 获取指定时间之间相隔多少年
print datediff ( year , ' 2005-01-01 ' , ' 2008-01-01 ' )
-- 获取指定时间之间相隔多少月
print datediff ( month , ' 2005-01-01 ' , ' 2008-01-01 ' )
-- 获取指定时间之间相隔多少天
print datediff ( day , ' 2005-01-01 ' , ' 2008-01-01 ' )
-- 字符串合并
print ' abc ' + ' def '
print ' abcder '
print ' abc ' + ' 456 '
print ' abc ' + 456
-- 类型转换
print ' abc ' + convert ( varchar ( 10 ), 456 )
select title_id, type, price from titles
-- 字符串连接必须保证类型一致(以下语句执行将会出错)
-- 类型转换
select title_id + type + price from titles
-- 正确
select title_id + type + convert ( varchar ( 10 ), price) from titles
print ' 123 ' + convert ( varchar ( 3 ), 123 )
print ' 123 ' + ' 123 '
-- 是否可以定义一个函数
-- 将作者编号作为参数统计其作品数量并将其返回
select au_id, au_lname, dbo.GetTitleCountByAuID(au_id) as TitleCount
from authors
order by TitleCount
-- 根据给定的作者编号获取其相应的作品数量
create function GetTitleCountByAuID( @au_id varchar ( 12 ))
returns int
begin
return ( select count (title_id)
from titleauthor
where au_id = @au_id )
end
-- 查看表结构
sp_help titles
-- 查看存储过程的定义内容
sp_helptext GetRankByTitleId
sp_helptext sp_helptext
sp_helptext xp_cmdshell
-- 声明
declare cur_titles cursor
for select title, price from titles
-- 打开
open cur_titles
declare @title varchar ( 80 )
declare @price numeric( 9 , 4 )
declare @title_temp varchar ( 80 )
declare @price_temp numeric( 9 , 4 )
-- 提取
fetch cur_titles into @title , @price
fetch cur_titles into @title_temp , @price_temp
while @@fetch_status = 0
begin
if @price < @price_temp
begin
set @price = @price_temp
set @title = @title_temp
end
fetch cur_titles into @title_temp , @price_temp
end
-- 关闭
close cur_titles
-- 释放
deallocate cur_titles
假设有张学生成绩表(CJ)如下
Name Subject Result
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 数学 92
李四 物理 82
想变成
姓名 语文 数学 物理
张三 80 90 85
李四 85 92 82
declare @sql varchar ( 4000 )
set @sql = ' select Name '
select @sql = @sql + ' ,sum(case Subject when ''' + Subject + ''' then Result end) [ ' + Subject + ' ] '
from ( select distinct Subject from CJ) as a
select @sql = @sql + ' from test group by name '
exec ( @sql )
2 . 行列转换 -- 合并
有表A,
id pid
1 1
1 2
1 3
2 1
2 2
3 1
如何化成表B:
id pid
1 1 , 2 , 3
2 1 , 2
3 1
创建一个合并的函数
create function fmerg( @id int )
returns varchar ( 8000 )
as
begin
declare @str varchar ( 8000 )
set @str = ''
select @str = @str + ' , ' + cast (pid as varchar ) from 表A where id = @id set @str = right ( @str , len ( @str ) - 1 )
return ( @str )
End
go
-- 调用自定义函数得到结果
select distinct id,dbo.fmerg(id) from 表A
查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = ' 表名 '
3 .取回表中字段:
declare @list varchar ( 1000 ), @sql nvarchar ( 1000 )
set @list = ''
-- set @sql = ''
select @list = @list + ' , ' + b.name from sysobjects a,syscolumns b where a.id = b.id and a.name = ' tb_user_msg '
set @sql = ' select ' + right ( @list , len ( @list ) - 1 ) + ' from tb_user_msg '
-- print @sql
exec sp_ExecuteSql @sql
4 .查看硬盘分区:
EXEC master..xp_fixeddrives
5 .比较A,B表是否相等:
if ( select checksum_agg(binary_checksum( * )) from A)
=
( select checksum_agg(binary_checksum( * )) from B)
print ' 相等 '
else
print ' 不相等 '
6 .杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR Select ' kill ' + RTRIM (spid) FROM master.dbo.sysprocesses
Where program_name IN ( ' SQL profiler ' ,N ' SQL 事件探查器 ' )
EXEC sp_msforeach_worker ' ? '
10 :获取某一个表的所有字段
select name from syscolumns where id = object_id ( ' 表名 ' )
11 :查看与某一个表相关的视图、存储过程、函数
select a. * from sysobjects a, syscomments b where a.id = b.id and b. text like ' %表名% '
9 :获取当前数据库中的所有用户表
select Name from sysobjects where xtype = ' u ' and status >= 0
12 :查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype = ' P '
14 :查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = ' 表名 '
SQL字符函数:
返回字符串中从左边开始指定个数的字符。 LEFT ( character_expression , integer_expression )
Select LEFT (Name, 5 ) FROM Production.Product orDER BY ProductID;
RIGHT :返回字符表达式中从起始位置(从右端开始)到指定字符位置(从右端开始计数)的部分。
RIGHT (character_expression,integer_expression)
RIGHT ("Mountain Bike", 4 ) 返回结果Bike
LEN :返回给定字符串表达式的字符数(不包括尾随空格),而不是返回字节数。
LEN ( string_expression )
Select CompanyName, LEN (CompanyName)
FROM Customers
REPLICATE :按指定次数重复字符表达式。
REPLICATE ( character_expression, integer_expression)
下面的示例将 Employee 表中每一名雇员的姓氏复制两次:
Select REPLICATE (LastName, 2 ) AS "LastName Twice"
FROM Employees
SUBSTRING :返回 $sourceString 的子串,从 $startingLoc 指定的位置开始,长度为 $length 指定的字符数。 SUBSTRING ( expression, start, length )
下面的示例返回 Employees 表中每位雇员的名字首字母及完整姓氏:
Select SUBSTRING (First Name, 1 , 1 ) AS Initial, Last Name
FROM Employees
STUFF :删除指定长度的字符并在指定的起始点插入另一组字符。 -- 替换
STUFF ( character_expression, start, length, character_expression )
Select STUFF (ProductID, 2 , 1 , ' 000 ' )
FROM Products
PATINDEX :对于所有有效的文本和字符数据类型,返回指定表达式中模式第一次出现的起始位置,如果未找到模式,则返回零。
PATINDEX ( ' %pattern% ' , expression )
下面的示例搜索其名称包含单词“Anton”的产品的列表。
Select ProductName, PATINDEX ( ' %Anton% ' , ProductName)
FROM Products
CHARINDEX :返回字符串中指定表达式的起始位置。
CHARINDEX ( expression1 , expression2 [ , start_location ] )
下面的示例从数据库中的员工姓氏中搜索表达式“an”:
Select [ Last Name ] , CHARINDEX ( ' an ' , [ Last Name ] ) AS Position
FROM Employees
</script>