本文的源地址:  
    [1] http://ghd258.cnblogs.com/archive/2006/03/20/354147.html

    [2] http://ghd258.cnblogs.com/archive/2006/07/14/450585.html

    [3 http://ghd258.cnblogs.com/archive/2006/02/12/329288.html

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

    select top 0 * into [t1] from [t2]

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

    (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操作收集( 一)
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操作收集( 一)


    (2)用法如下:

T-SQL操作收集( 一)print dbo.fgetscript('服务器名','用户名','密码','数据库名','表名或其它对象名')


    (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操作收集( 一)


    3 分隔字符串

    如果有一个用逗号分割开的字符串,比如说"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)

    4  一条语句执行跨越若干个数据库

    我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢?
    方法一:

T-SQL操作收集( 一)select * from OPENDATASOURCE('SQLOLEDB','Data Source=远程ip;User ID=sa;Password=密码').库名.dbo.表名

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

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


    5 获取一个表中所有的字段信息

    先创建一个视图

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操作收集( 一)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操作收集( 一)


    6  时间格式转换问题

    因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过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')

 

    (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')

 

    7 分区视图

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

 

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操作收集( 一)
*/

 


    8 树型的实现

 

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

 

    9 排序问题

 数据库里有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

    10 一条语句删除一批记录

    首先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 )

    11 获取子表内的一列数据的组合字符串

    下面这个函数获取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

    12 让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

     13  四种方法取表里n到m条纪录

    (1) 第一种 

T-SQL操作收集( 一) 如果tablename里没有其他identity列,那么:

 

T-SQL操作收集( 一)select top m * into 临时表(或表变量) from tablename order by columnname -- 将top m笔插入
T-SQL操作收集( 一)
set rowcount n
T-SQL操作收集( 一)
select * from 表变量 order by columnname desc

   (2) 第二种 

 

T-SQL操作收集( 一)select top n * from (select top m * from tablename order by columnname) a order by columnname desc

   (3) 第三种

T-SQL操作收集( 一) select identity(int) id0,* into #temp from tablename

T-SQL操作收集( 一) 取n到m条的语句为:

T-SQL操作收集( 一) select * from #temp where id0 >=n and id0 <= m

T-SQL操作收集( 一) 如果你在执行 select identity(int) id0,* into #temp from tablename这条语句的时候报错,那是因为你的DB中间的select into/bulkcopy属性没有打开要先执行:
T-SQL操作收集( 一) exec sp_dboption 你的DB名字,'select into/bulkcopy',true


T-SQL操作收集( 一)  
(4) 第四种
T-SQL操作收集( 一) 如果表里有identity属性,那么简单:T-SQL操作收集( 一) 

T-SQL操作收集( 一)select * from tablename where identitycol between n and m 


T-SQL操作收集( 一)  14 快速获取表test的记录总数

T-SQL操作收集( 一)select rows from sysindexes where id = object_id('test'and indid in (0,1)

T-SQL操作收集( 一)  15 提取数据库内所有表的字段详细说明的SQL语句

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 '' 
T-SQL操作收集( 一)
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操作收集( 一)
FROM syscolumns a 
T-SQL操作收集( 一)
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操作收集( 一)获取表结构
[把 'sysobjects' 替换 成 'tablename' 即可] 
T-SQL操作收集( 一)
T-SQL操作收集( 一)
SELECT CASE IsNull(I.name, ''
T-SQL操作收集( 一)
When '' Then '' 
T-SQL操作收集( 一)
Else '*' 
T-SQL操作收集( 一)
End as IsPK, 
T-SQL操作收集( 一)
Object_Name(A.id) as t_name, 
T-SQL操作收集( 一)A.name 
as c_name, 
T-SQL操作收集( 一)
IsNull(SubString(M.text1254), ''as pbc_init, 
T-SQL操作收集( 一)T.name 
as F_DataType, 
T-SQL操作收集( 一)
CASE IsNull(TYPEPROPERTY(T.name, 'Scale'), ''
T-SQL操作收集( 一)
WHEN '' Then Cast(A.prec as varchar
T-SQL操作收集( 一)
ELSE Cast(A.prec as varchar+ ',' + Cast(A.scale as varchar
T-SQL操作收集( 一)
END as F_Scale, 
T-SQL操作收集( 一)A.isnullable 
as F_isNullAble 
T-SQL操作收集( 一)
FROM Syscolumns as A 
T-SQL操作收集( 一)
JOIN Systypes as T 
T-SQL操作收集( 一)
ON (A.xType = T.xUserType AND A.Id = Object_id('sysobjects') ) 
T-SQL操作收集( 一)
LEFT JOIN ( SysIndexes as I 
T-SQL操作收集( 一)
JOIN Syscolumns as A1 
T-SQL操作收集( 一)
ON ( I.id = A1.id and A1.id = object_id('sysobjects'and (I.status & 0x800= 0x800 AND A1.colid <= I.keycnt) ) 
T-SQL操作收集( 一)
ON ( A.id = I.id AND A.name = index_col('sysobjects', I.indid, A1.colid) ) 
T-SQL操作收集( 一)
LEFT JOIN SysComments as M 
T-SQL操作收集( 一)
ON ( M.id = A.cdefault and ObjectProperty(A.cdefault, 'IsConstraint'= 1 ) 
T-SQL操作收集( 一)
ORDER BY A.Colid ASC
T-SQL操作收集( 一)


T-SQL操作收集( 一)  16 SQL Server中删除重复数据的几个方法
T-SQL操作收集( 一) 
 T-SQL操作收集( 一)  
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置。

T-SQL操作收集( 一)  (1) 方法一

T-SQL操作收集( 一)declare @max integer,@id integer
T-SQL操作收集( 一)
declare cur_rows cursor local for select 主字段,count(*from 表名 group by 主字段 having count(*> 1
T-SQL操作收集( 一)
open cur_rows
T-SQL操作收集( 一)
fetch cur_rows into @id,@max
T-SQL操作收集( 一)
while @@fetch_status=0
T-SQL操作收集( 一)
begin
T-SQL操作收集( 一)
select @max = @max -1
T-SQL操作收集( 一)
set rowcount @max
T-SQL操作收集( 一)
delete from 表名 where 主字段 = @id
T-SQL操作收集( 一)
fetch cur_rows into @id,@max
T-SQL操作收集( 一)
end
T-SQL操作收集( 一)
close cur_rows
T-SQL操作收集( 一)
set rowcount 0 

T-SQL操作收集( 一)  (2) 方法二

T-SQL操作收集( 一)  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

T-SQL操作收集( 一)  〈1〉 对于第一种重复,比较容易解决,使用

T-SQL操作收集( 一)select distinct * from tableName 

T-SQL操作收集( 一)  就可以得到无重复记录的结果集。

T-SQL操作收集( 一)  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

T-SQL操作收集( 一)select distinct * into #Tmp from tableName
T-SQL操作收集( 一)
drop table tableName
T-SQL操作收集( 一)
select * into tableName from #Tmp
T-SQL操作收集( 一)
drop table #Tmp 

T-SQL操作收集( 一)  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

T-SQL操作收集( 一) 〈2〉 这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

T-SQL操作收集( 一) 假设有重复的字段为Name, Address,要求得到这两个字段唯一的结果集

T-SQL操作收集( 一)select identity(int,1,1as autoID, * into #Tmp from tableName
T-SQL操作收集( 一)
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
T-SQL操作收集( 一)
select * from #Tmp where autoID in(select autoID from #tmp2) 

T-SQL操作收集( 一) 最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

T-SQL操作收集( 一)  17 查询分析器不能单步调试的的原因

T-SQL操作收集( 一)  具体步骤如下:
T-SQL操作收集( 一)  1、将服务器【身份验证】属性设置成【混合模式】(window与sql身份验证)
T-SQL操作收集( 一)  2、在【控制面板】中打开【服务】将【MSSQLSERVER】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
T-SQL操作收集( 一)  3、重新启动sqlserver服务,此时的服务指的是【SQL服务管理器】中的SQL SERVER服务;假设【帐号】设置为administrator
T-SQL操作收集( 一)  此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;
T-SQL操作收集( 一)  如果想让【其他帐号】也能够调试,那么还需要如下设置:
T-SQL操作收集( 一)  1、在【服务器】上运行dcomcnfg.exe;
T-SQL操作收集( 一)  2、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
T-SQL操作收集( 一)  3、重新启动sqlserver服务;
T-SQL操作收集( 一)  3、在客户端上创建与服务帐号密码一样的用户,如sample;
T-SQL操作收集( 一)  做到这步就可以通过查询分析器的调试功能进行单步调试了。
T-SQL操作收集( 一)  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。
T-SQL操作收集( 一)  不然,event log:
T-SQL操作收集( 一)  以当前密码登录的尝试因下列错误而宣告失败:
T-SQL操作收集( 一)  在第一次登录之前,必须更改用户密码。

相关文章: