蛙蛙推荐:整理了一些t-sql技巧

一、 只复制一个表结构,不复制数据

 

蛙蛙推荐:整理了一些t-sql技巧select top 0 * into [t1] from [t2]


二、 获取数据库中某个对象的创建脚本

1、 先用下面的脚本创建一个函数

蛙蛙推荐:整理了一些t-sql技巧if exists(select 1 from sysobjects where id=object_id('fgetscript'and objectproperty(id,'IsInlineFunction')=0)
蛙蛙推荐:整理了一些t-sql技巧 
drop function fgetscript
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
create function fgetscript(
蛙蛙推荐:整理了一些t-sql技巧 
@servername varchar(50)     --服务器名
蛙蛙推荐:整理了一些t-sql技巧
 ,@userid varchar(50)='sa'    --用户名,如果为nt验证方式,则为空
蛙蛙推荐:整理了一些t-sql技巧
 ,@password varchar(50)=''    --密码
蛙蛙推荐:整理了一些t-sql技巧
 ,@databasename varchar(50)    --数据库名称
蛙蛙推荐:整理了一些t-sql技巧
 ,@objectname varchar(250)    --对象名
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧
returns varchar(8000)
蛙蛙推荐:整理了一些t-sql技巧
as
蛙蛙推荐:整理了一些t-sql技巧
begin
蛙蛙推荐:整理了一些t-sql技巧 
declare @re varchar(8000)        --返回脚本
蛙蛙推荐:整理了一些t-sql技巧
 declare @srvid int,@dbsid int       --定义服务器、数据库集id
蛙蛙推荐:整理了一些t-sql技巧
 declare @dbid int,@tbid int        --数据库、表id
蛙蛙推荐:整理了一些t-sql技巧
 declare @err int,@src varchar(255), @desc varchar(255--错误处理变量
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧
--创建sqldmo对象
蛙蛙推荐:整理了一些t-sql技巧
 exec @err=sp_oacreate 'sqldmo.sqlserver',@srvid output
蛙蛙推荐:整理了一些t-sql技巧 
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--连接服务器
蛙蛙推荐:整理了一些t-sql技巧
 if isnull(@userid,'')='' --如果是 Nt验证方式
蛙蛙推荐:整理了一些t-sql技巧
 begin
蛙蛙推荐:整理了一些t-sql技巧  
exec @err=sp_oasetproperty @srvid,'loginsecure',1
蛙蛙推荐:整理了一些t-sql技巧  
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧  
exec @err=sp_oamethod @srvid,'connect',null,@servername
蛙蛙推荐:整理了一些t-sql技巧 
end
蛙蛙推荐:整理了一些t-sql技巧 
else
蛙蛙推荐:整理了一些t-sql技巧  
exec @err=sp_oamethod @srvid,'connect',null,@servername,@userid,@password
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧 
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--获取数据库集
蛙蛙推荐:整理了一些t-sql技巧
 exec @err=sp_oagetproperty @srvid,'databases',@dbsid output
蛙蛙推荐:整理了一些t-sql技巧 
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--获取要取得脚本的数据库id
蛙蛙推荐:整理了一些t-sql技巧
 exec @err=sp_oamethod @dbsid,'item',@dbid output,@databasename
蛙蛙推荐:整理了一些t-sql技巧 
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--获取要取得脚本的对象id
蛙蛙推荐:整理了一些t-sql技巧
 exec @err=sp_oamethod @dbid,'getobjectbyname',@tbid output,@objectname
蛙蛙推荐:整理了一些t-sql技巧 
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--取得脚本
蛙蛙推荐:整理了一些t-sql技巧
 exec @err=sp_oamethod @tbid,'script',@re output
蛙蛙推荐:整理了一些t-sql技巧 
if @err<>0 goto lberr
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧 
--print @re
蛙蛙推荐:整理了一些t-sql技巧
 return(@re)
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧lberr:
蛙蛙推荐:整理了一些t-sql技巧 
exec sp_oageterrorinfo NULL@src out, @desc out 
蛙蛙推荐:整理了一些t-sql技巧 
declare @errb varbinary(4)
蛙蛙推荐:整理了一些t-sql技巧 
set @errb=cast(@err as varbinary(4))
蛙蛙推荐:整理了一些t-sql技巧 
exec master..xp_varbintohexstr @errb,@re out
蛙蛙推荐:整理了一些t-sql技巧 
set @re='错误号: '+@re
蛙蛙推荐:整理了一些t-sql技巧   
+char(13)+'错误源: '+@src
蛙蛙推荐:整理了一些t-sql技巧   
+char(13)+'错误描述: '+@desc
蛙蛙推荐:整理了一些t-sql技巧 
return(@re)
蛙蛙推荐:整理了一些t-sql技巧
end
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧

2、 用法如下
用法如下,

蛙蛙推荐:整理了一些t-sql技巧print dbo.fgetscript('服务器名','用户名','密码','数据库名','表名或其它对象名')
蛙蛙推荐:整理了一些t-sql技巧

3、 如果要获取库里所有对象的脚本,如如下方式

蛙蛙推荐:整理了一些t-sql技巧declare @name varchar(250)
蛙蛙推荐:整理了一些t-sql技巧
declare #aa cursor for
蛙蛙推荐:整理了一些t-sql技巧 
select name from sysobjects where xtype not in('S','PK','D','X','L')
蛙蛙推荐:整理了一些t-sql技巧
open #aa
蛙蛙推荐:整理了一些t-sql技巧
fetch next from #aa into @name
蛙蛙推荐:整理了一些t-sql技巧
while @@fetch_status=0
蛙蛙推荐:整理了一些t-sql技巧
begin
蛙蛙推荐:整理了一些t-sql技巧 
print dbo.fgetscript('onlytiancai','sa','sa','database',@name)
蛙蛙推荐:整理了一些t-sql技巧 
fetch next from #aa into @name
蛙蛙推荐:整理了一些t-sql技巧
end
蛙蛙推荐:整理了一些t-sql技巧
close #aa
蛙蛙推荐:整理了一些t-sql技巧
deallocate #aa
蛙蛙推荐:整理了一些t-sql技巧

4、 声明,此函数是csdn邹建邹老大提供的
三、 分隔字符串
如果有一个用逗号分割开的字符串,比如说"a,b,c,d,1,2,3,4",如何用t-sql获取这个字符串有几个元素,获取第几个元素的值是多少呢?因为t-sql里没有split函数,也没有数组的概念,所以只能自己写几个函数了。
1、 获取元素个数的函数

蛙蛙推荐:整理了一些t-sql技巧create function getstrarrlength (@str varchar(8000))
蛙蛙推荐:整理了一些t-sql技巧
returns int
蛙蛙推荐:整理了一些t-sql技巧
as
蛙蛙推荐:整理了一些t-sql技巧
begin
蛙蛙推荐:整理了一些t-sql技巧  
declare @int_return int
蛙蛙推荐:整理了一些t-sql技巧  
declare @start int
蛙蛙推荐:整理了一些t-sql技巧  
declare @next int
蛙蛙推荐:整理了一些t-sql技巧  
declare @location int
蛙蛙推荐:整理了一些t-sql技巧  
select @str =','+ @str +','
蛙蛙推荐:整理了一些t-sql技巧  
select @str=replace(@str,',,',',')
蛙蛙推荐:整理了一些t-sql技巧  
select @start =1
蛙蛙推荐:整理了一些t-sql技巧  
select @next =1 
蛙蛙推荐:整理了一些t-sql技巧  
select @location = charindex(',',@str,@start)
蛙蛙推荐:整理了一些t-sql技巧  
while (@location <>0)
蛙蛙推荐:整理了一些t-sql技巧  
begin
蛙蛙推荐:整理了一些t-sql技巧    
select @start = @location +1
蛙蛙推荐:整理了一些t-sql技巧    
select @location = charindex(',',@str,@start)
蛙蛙推荐:整理了一些t-sql技巧    
select @next =@next +1
蛙蛙推荐:整理了一些t-sql技巧  
end
蛙蛙推荐:整理了一些t-sql技巧 
select @int_return = @next-2
蛙蛙推荐:整理了一些t-sql技巧 
return @int_return
蛙蛙推荐:整理了一些t-sql技巧
end
蛙蛙推荐:整理了一些t-sql技巧

2、 获取指定索引的值的函数

蛙蛙推荐:整理了一些t-sql技巧create function getstrofindex (@str varchar(8000),@index int =0)
蛙蛙推荐:整理了一些t-sql技巧
returns varchar(8000)
蛙蛙推荐:整理了一些t-sql技巧
as
蛙蛙推荐:整理了一些t-sql技巧
begin
蛙蛙推荐:整理了一些t-sql技巧  
declare @str_return varchar(8000)
蛙蛙推荐:整理了一些t-sql技巧  
declare @start int
蛙蛙推荐:整理了一些t-sql技巧  
declare @next int
蛙蛙推荐:整理了一些t-sql技巧  
declare @location int
蛙蛙推荐:整理了一些t-sql技巧  
select @start =1
蛙蛙推荐:整理了一些t-sql技巧  
select @next =1 --如果习惯从0开始则select @next =0
蛙蛙推荐:整理了一些t-sql技巧
  select @location = charindex(',',@str,@start)
蛙蛙推荐:整理了一些t-sql技巧  
while (@location <>0 and @index > @next )
蛙蛙推荐:整理了一些t-sql技巧  
begin
蛙蛙推荐:整理了一些t-sql技巧    
select @start = @location +1
蛙蛙推荐:整理了一些t-sql技巧    
select @location = charindex(',',@str,@start)
蛙蛙推荐:整理了一些t-sql技巧    
select @next =@next +1
蛙蛙推荐:整理了一些t-sql技巧  
end
蛙蛙推荐:整理了一些t-sql技巧  
if @location =0 select @location =len(@str)+1 --如果是因为没有逗号退出,则认为逗号在字符串后
蛙蛙推荐:整理了一些t-sql技巧
  select @str_return = substring(@str,@start,@location -@start--@start肯定是逗号之后的位置或者就是初始值1
蛙蛙推荐:整理了一些t-sql技巧
  if (@index <> @next ) select @str_return = '' --如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。
蛙蛙推荐:整理了一些t-sql技巧
  return @str_return
蛙蛙推荐:整理了一些t-sql技巧
end
蛙蛙推荐:整理了一些t-sql技巧

3、 测试

蛙蛙推荐:整理了一些t-sql技巧SELECT [dbo].[getstrarrlength]('1,2,3,4,a,b,c,d')
蛙蛙推荐:整理了一些t-sql技巧
SELECT [dbo].[getstrofindex]('1,2,3,4,a,b,c,d',5)
蛙蛙推荐:整理了一些t-sql技巧

四、 一条语句执行跨越若干个数据库
我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢?
第一种方法:

蛙蛙推荐:整理了一些t-sql技巧select * from OPENDATASOURCE('SQLOLEDB','Data Source=远程ip;User ID=sa;Password=密码').库名.dbo.表名
蛙蛙推荐:整理了一些t-sql技巧

第二种方法:
先使用联结服务器:

蛙蛙推荐:整理了一些t-sql技巧EXEC sp_addlinkedserver '别名','','MSDASQL',NULL,NULL,'DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码;'
蛙蛙推荐:整理了一些t-sql技巧
exec sp_addlinkedsrvlogin  @rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'
蛙蛙推荐:整理了一些t-sql技巧
GO
蛙蛙推荐:整理了一些t-sql技巧

然后你就可以如下:

蛙蛙推荐:整理了一些t-sql技巧select * from 别名.库名.dbo.表名
蛙蛙推荐:整理了一些t-sql技巧
insert 库名.dbo.表名 select * from 别名.库名.dbo.表名
蛙蛙推荐:整理了一些t-sql技巧
select * into 库名.dbo.新表名 from 别名.库名.dbo.表名
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧

五、 怎样获取一个表中所有的字段信息
蛙蛙推荐:怎样获取一个表中所有字段的信息
先创建一个视图

蛙蛙推荐:整理了一些t-sql技巧Create view fielddesc    
蛙蛙推荐:整理了一些t-sql技巧
as
蛙蛙推荐:整理了一些t-sql技巧
select o.name as table_name,c.name as field_name,t.name as type,c.length as 
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧length,c.isnullable 
as isnullable,convert(varchar(30),p.value) as desp 
蛙蛙推荐:整理了一些t-sql技巧
from syscolumns c  
蛙蛙推荐:整理了一些t-sql技巧
join systypes t on c.xtype = t.xusertype
蛙蛙推荐:整理了一些t-sql技巧
join sysobjects o on o.id=c.id 
蛙蛙推荐:整理了一些t-sql技巧
left join    sysproperties p on p.smallid=c.colid and p.id=o.id    
蛙蛙推荐:整理了一些t-sql技巧
where o.xtype='U'
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧

查询时:

蛙蛙推荐:整理了一些t-sql技巧Select * from fielddesc where table_name = '你的表名'

 

还有个更强的语句,是邹建写的,也写出来吧

蛙蛙推荐:整理了一些t-sql技巧SELECT 
蛙蛙推荐:整理了一些t-sql技巧 (
case when a.colorder=1 then d.name else '' end) N'表名',
蛙蛙推荐:整理了一些t-sql技巧 a.colorder N
'字段序号',
蛙蛙推荐:整理了一些t-sql技巧 a.name N
'字段名',
蛙蛙推荐:整理了一些t-sql技巧 (
case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then ''else '' end) N'标识',
蛙蛙推荐:整理了一些t-sql技巧 (
case when (SELECT count(*)
蛙蛙推荐:整理了一些t-sql技巧 
FROM sysobjects
蛙蛙推荐:整理了一些t-sql技巧 
WHERE (name in
蛙蛙推荐:整理了一些t-sql技巧           (
SELECT name
蛙蛙推荐:整理了一些t-sql技巧          
FROM sysindexes
蛙蛙推荐:整理了一些t-sql技巧          
WHERE (id = a.id) AND (indid in
蛙蛙推荐:整理了一些t-sql技巧                    (
SELECT indid
蛙蛙推荐:整理了一些t-sql技巧                   
FROM sysindexkeys
蛙蛙推荐:整理了一些t-sql技巧                   
WHERE (id = a.id) AND (colid in
蛙蛙推荐:整理了一些t-sql技巧                             (
SELECT colid
蛙蛙推荐:整理了一些t-sql技巧                            
FROM syscolumns
蛙蛙推荐:整理了一些t-sql技巧                            
WHERE (id = a.id) AND (name = a.name))))))) AND
蛙蛙推荐:整理了一些t-sql技巧        (xtype 
= 'PK'))>0 then '' else '' end) N'主键',
蛙蛙推荐:整理了一些t-sql技巧 b.name N
'类型',
蛙蛙推荐:整理了一些t-sql技巧 a.length N
'占用字节数',
蛙蛙推荐:整理了一些t-sql技巧 
COLUMNPROPERTY(a.id,a.name,'PRECISION'as N'长度',
蛙蛙推荐:整理了一些t-sql技巧 
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0as N'小数位数',
蛙蛙推荐:整理了一些t-sql技巧 (
case when a.isnullable=1 then ''else '' end) N'允许空',
蛙蛙推荐:整理了一些t-sql技巧 
isnull(e.text,'') N'默认值',
蛙蛙推荐:整理了一些t-sql技巧 
isnull(g.[value],''AS N'字段说明'
蛙蛙推荐:整理了一些t-sql技巧
--into ##tx
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧
FROM  syscolumns  a left join systypes b 
蛙蛙推荐:整理了一些t-sql技巧
on  a.xtype=b.xusertype
蛙蛙推荐:整理了一些t-sql技巧
inner join sysobjects d 
蛙蛙推荐:整理了一些t-sql技巧
on a.id=d.id  and  d.xtype='U' and  d.name<>'dtproperties'
蛙蛙推荐:整理了一些t-sql技巧
left join syscomments e
蛙蛙推荐:整理了一些t-sql技巧
on a.cdefault=e.id
蛙蛙推荐:整理了一些t-sql技巧
left join sysproperties g
蛙蛙推荐:整理了一些t-sql技巧
on a.id=g.id AND a.colid = g.smallid  
蛙蛙推荐:整理了一些t-sql技巧
order by object_name(a.id),a.colorder
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧

六、 时间格式转换问题
因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过convert函数和case语句,还有"+"操作符在不同上下文环境也会起到不同的作用,把我搞晕了要,不过现在看来是差不多弄好了。

1、把所有"70.07.06"这样的值变成"1970-07-06"

蛙蛙推荐:整理了一些t-sql技巧UPDATE lvshi
蛙蛙推荐:整理了一些t-sql技巧
SET shengri = '19' + REPLACE(shengri, '.''-')
蛙蛙推荐:整理了一些t-sql技巧
WHERE (zhiyezheng = '139770070153')

 

2、在"1970-07-06"里提取"70","07","06"

蛙蛙推荐:整理了一些t-sql技巧SELECT SUBSTRING(shengri, 32AS yearSUBSTRING(shengri, 62AS month
蛙蛙推荐:整理了一些t-sql技巧      
SUBSTRING(shengri, 92AS day
蛙蛙推荐:整理了一些t-sql技巧
FROM lvshi
蛙蛙推荐:整理了一些t-sql技巧
WHERE (zhiyezheng = '139770070153')
蛙蛙推荐:整理了一些t-sql技巧

3、把一个时间类型字段转换成"1970-07-06"

蛙蛙推荐:整理了一些t-sql技巧UPDATE lvshi
蛙蛙推荐:整理了一些t-sql技巧
SET shenling = CONVERT(varchar(4), YEAR(shenling)) 
蛙蛙推荐:整理了一些t-sql技巧      
+ '-' + CASE WHEN LEN(MONTH(shenling)) = 1 THEN '0' + CONVERT(varchar(2), 
蛙蛙推荐:整理了一些t-sql技巧      
month(shenling)) ELSE CONVERT(varchar(2), month(shenling)) 
蛙蛙推荐:整理了一些t-sql技巧      
END + '-' + CASE WHEN LEN(day(shenling)) = 1 THEN '0' + CONVERT(char(2), 
蛙蛙推荐:整理了一些t-sql技巧      
day(shenling)) ELSE CONVERT(varchar(2), day(shenling)) END
蛙蛙推荐:整理了一些t-sql技巧
WHERE (zhiyezheng = '139770070153')
蛙蛙推荐:整理了一些t-sql技巧

七、 分区视图
分区视图是提高查询性能的一个很好的办法

蛙蛙推荐:整理了一些t-sql技巧--看下面的示例
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧
--示例表
蛙蛙推荐:整理了一些t-sql技巧
create table tempdb.dbo.t_10(
蛙蛙推荐:整理了一些t-sql技巧id 
int primary key check(id between 1 and 10),name varchar(10))
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
create table pubs.dbo.t_20(
蛙蛙推荐:整理了一些t-sql技巧id 
int primary key check(id between 11 and 20),name varchar(10))
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
create table northwind.dbo.t_30(
蛙蛙推荐:整理了一些t-sql技巧id 
int primary key check(id between 21 and 30),name varchar(10))
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--分区视图
蛙蛙推荐:整理了一些t-sql技巧
create view v_t
蛙蛙推荐:整理了一些t-sql技巧
as
蛙蛙推荐:整理了一些t-sql技巧
select * from tempdb.dbo.t_10
蛙蛙推荐:整理了一些t-sql技巧
union all
蛙蛙推荐:整理了一些t-sql技巧
select * from pubs.dbo.t_20
蛙蛙推荐:整理了一些t-sql技巧
union all
蛙蛙推荐:整理了一些t-sql技巧
select * from northwind.dbo.t_30
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--插入数据
蛙蛙推荐:整理了一些t-sql技巧
insert v_t select 1 ,'aa'
蛙蛙推荐:整理了一些t-sql技巧
union  all select 2 ,'bb'
蛙蛙推荐:整理了一些t-sql技巧
union  all select 11,'cc'
蛙蛙推荐:整理了一些t-sql技巧
union  all select 12,'dd'
蛙蛙推荐:整理了一些t-sql技巧
union  all select 21,'ee'
蛙蛙推荐:整理了一些t-sql技巧
union  all select 22,'ff'
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--更新数据
蛙蛙推荐:整理了一些t-sql技巧
update v_t set name=name+'_更新' where right(id,1)=1
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--删除测试
蛙蛙推荐:整理了一些t-sql技巧
delete from v_t where right(id,1)=2
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--显示结果
蛙蛙推荐:整理了一些t-sql技巧
select * from v_t
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--删除测试
蛙蛙推荐:整理了一些t-sql技巧
drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
蛙蛙推荐:整理了一些t-sql技巧
drop view v_t
蛙蛙推荐:整理了一些t-sql技巧


八、 树型的实现
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧--参考
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧
--树形数据查询示例
蛙蛙推荐:整理了一些t-sql技巧--
作者: 邹建
蛙蛙推荐:整理了一些t-sql技巧

蛙蛙推荐:整理了一些t-sql技巧
--示例数据
蛙蛙推荐:整理了一些t-sql技巧
create table [tb]([id] int identity(1,1),[pid] int,name varchar(20))
蛙蛙推荐:整理了一些t-sql技巧
insert [tb] select 0,'中国'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 0,'美国'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 0,'加拿大'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 1,'北京'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 1,'上海'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 1,'江苏'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 6,'苏州'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 7,'常熟'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 6,'南京'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 6,'无锡'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 2,'纽约'
蛙蛙推荐:整理了一些t-sql技巧
union  all  select 2,'旧金山'
蛙蛙推荐:整理了一些t-sql技巧
go
蛙蛙推荐:整理了一些t-sql技巧
蛙蛙推荐:整理了一些t-sql技巧
--查询指定id的所有子
蛙蛙推荐:整理了一些t-sql技巧
create function f_cid(
蛙蛙推荐:整理了一些t-sql技巧
@id int
蛙蛙推荐:整理了一些t-sql技巧)
returns @re table([id] int,[level] int)
蛙蛙推荐:整理了一些t-sql技巧
as
蛙蛙推荐:整理了一些t-sql技巧
begin
蛙蛙推荐:整理了一些t-sql技巧 
declare @l int
蛙蛙推荐:整理了一些t-sql技巧 
set @l=0
蛙蛙推荐:整理了一些t-sql技巧 
insert @re select @id,@l
蛙蛙推荐:整理了一些t-sql技巧 
while @@rowcount>0
蛙蛙推荐:整理了一些t-sql技巧 
begin
蛙蛙推荐:整理了一些t-sql技巧  
set @l=@l+1
蛙蛙推荐:整理了一些t-sql技巧  
insert @re select a.[id],@l
蛙蛙推荐:整理了一些t-sql技巧  
from [tb] a,@re b
蛙蛙推荐:整理了一些t-sql技巧  
where a.[pid]=b.[id] and b.[level]=@l-1
蛙蛙推荐:整理了一些t-sql技巧 
end

 

九、 排序问题
数据库里有1,2,3,4,5 共5条记录,要用一条sql语句让其排序,使它排列成4,5,1,2,3,怎么写?

蛙蛙推荐:整理了一些t-sql技巧CREATE TABLE [t] (
蛙蛙推荐:整理了一些t-sql技巧 
[id] [int] IDENTITY (11NOT NULL ,
蛙蛙推荐:整理了一些t-sql技巧 
[GUID] [uniqueidentifier] NULL 
蛙蛙推荐:整理了一些t-sql技巧
ON [PRIMARY]
蛙蛙推荐:整理了一些t-sql技巧
GO


下面这句执行5次

蛙蛙推荐:整理了一些t-sql技巧insert t values (newid())


查看执行结果

蛙蛙推荐:整理了一些t-sql技巧select * from t


1、 第一种

蛙蛙推荐:整理了一些t-sql技巧select * from t
蛙蛙推荐:整理了一些t-sql技巧 
order by case id when 4 then 1
蛙蛙推荐:整理了一些t-sql技巧                  
when 5 then 2
蛙蛙推荐:整理了一些t-sql技巧                  
when 1 then 3
蛙蛙推荐:整理了一些t-sql技巧                  
when 2 then 4
蛙蛙推荐:整理了一些t-sql技巧                  
when 3 then 5 end


2、 第二种

蛙蛙推荐:整理了一些t-sql技巧select * from t order by (id+2)%6


3、 第三种

蛙蛙推荐:整理了一些t-sql技巧select * from t order by charindex(cast(id as varchar),'45123')


4、 第四种

蛙蛙推荐:整理了一些t-sql技巧select * from t
蛙蛙推荐:整理了一些t-sql技巧
WHERE id between 0 and 5
蛙蛙推荐:整理了一些t-sql技巧
order by charindex(cast(id as varchar),'45123')


5、 第五种

蛙蛙推荐:整理了一些t-sql技巧select * from t order by case when id >3 then id-5 else id end


6、 第六种

蛙蛙推荐:整理了一些t-sql技巧select * from t order by id / 4 desc,id asc

 

十、 一条语句删除一批记录
首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删
除了,比循环用多条语句高效吧应该。

蛙蛙推荐:整理了一些t-sql技巧delete from [fujian] where charindex(','+cast([id] as varchar)+',',','+'5,6,8,9,10,11,'+',')>0


还有一种就是

蛙蛙推荐:整理了一些t-sql技巧delete from table1 where id in(1,2,3,4 蛙蛙推荐:整理了一些t-sql技巧)


十一、获取子表内的一列数据的组合字符串
下面这个函数获取05年已经注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的所有律师。

蛙蛙推荐:整理了一些t-sql技巧CREATE   FUNCTION fn_Get05LvshiNameBySuo  (@p_suo Nvarchar(50))
蛙蛙推荐:整理了一些t-sql技巧
RETURNS Nvarchar(2000)
蛙蛙推荐:整理了一些t-sql技巧
AS
蛙蛙推荐:整理了一些t-sql技巧
BEGIN  
蛙蛙推荐:整理了一些t-sql技巧 
DECLARE @LvshiNames varchar(2000), @name varchar(50)
蛙蛙推荐:整理了一些t-sql技巧 
select @LvshiNames=''
蛙蛙推荐:整理了一些t-sql技巧 
DECLARE lvshi_cursor CURSOR FOR
蛙蛙推荐:整理了一些t-sql技巧 
select [name] from [lvshi] where charindex(','+'05'+',',','+zhuce+',')>0 and suo=@p_suo order by id desc
蛙蛙推荐:整理了一些t-sql技巧 
OPEN lvshi_cursor
蛙蛙推荐:整理了一些t-sql技巧 
FETCH NEXT FROM lvshi_cursor
蛙蛙推荐:整理了一些t-sql技巧 
INTO @name
蛙蛙推荐:整理了一些t-sql技巧 
WHILE @@FETCH_STATUS = 0
蛙蛙推荐:整理了一些t-sql技巧 
BEGIN
蛙蛙推荐:整理了一些t-sql技巧     
SELECT @LvshiNames = @LvshiNames + @name + ','
蛙蛙推荐:整理了一些t-sql技巧  
fETCH NEXT FROM lvshi_cursor 
蛙蛙推荐:整理了一些t-sql技巧  
INTO @name
蛙蛙推荐:整理了一些t-sql技巧 
END
蛙蛙推荐:整理了一些t-sql技巧 
CLOSE lvshi_cursor
蛙蛙推荐:整理了一些t-sql技巧 
DEALLOCATE lvshi_cursor
蛙蛙推荐:整理了一些t-sql技巧 
RETURN(@LvshiNames)
蛙蛙推荐:整理了一些t-sql技巧
END
蛙蛙推荐:整理了一些t-sql技巧

十二、让0变成1,1变成0

蛙蛙推荐:整理了一些t-sql技巧declare @a int
蛙蛙推荐:整理了一些t-sql技巧
set @a =0 --初始为0
蛙蛙推荐:整理了一些t-sql技巧
select @a
蛙蛙推荐:整理了一些t-sql技巧
set @a = @a^1 --把0变成1
蛙蛙推荐:整理了一些t-sql技巧
select @a
蛙蛙推荐:整理了一些t-sql技巧
set @a = @a^1 --把1变成0
蛙蛙推荐:整理了一些t-sql技巧
select @a


小节:上面的好多代码示例是我遇到问题的时候在csdn的论坛里搜索出的答案,还有一些零碎的技巧来不及整理,先贴这几条吧。的确,开发t-sql是很专业的事情,象偶等菜鸟得多积累,多总结,多归纳才行。

声明:好多代码的最早来源已无从查起哦,不过有好几个我确定是邹建写的。

相关文章: