整理了一些t-sql技巧

   
标题   整理了一些t-sql技巧      选择自 kingwkb 的 Blog
关键字   整理了一些t-sql技巧
出处  
 

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

 

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


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

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

if   exists ( select   1   from  sysobjects  where  id = object_id ( ' fgetscript ' and   objectproperty (id, ' IsInlineFunction ' ) = 0 )
 
drop   function  fgetscript
go

create   function  fgetscript(
 
@servername   varchar ( 50 )      -- 服务器名
 , @userid   varchar ( 50 ) = ' sa '      -- 用户名,如果为nt验证方式,则为空
 , @password   varchar ( 50 ) = ''      -- 密码
 , @databasename   varchar ( 50 )     -- 数据库名称
 , @objectname   varchar ( 250 )     -- 对象名

returns   varchar ( 8000 )
as
begin
 
declare   @re   varchar ( 8000 )         -- 返回脚本
  declare   @srvid   int , @dbsid   int         -- 定义服务器、数据库集id
  declare   @dbid   int , @tbid   int          -- 数据库、表id
  declare   @err   int , @src   varchar ( 255 ),  @desc   varchar ( 255 -- 错误处理变量

-- 创建sqldmo对象
  exec   @err = sp_oacreate  ' sqldmo.sqlserver ' , @srvid  output
 
if   @err <> 0   goto  lberr

-- 连接服务器
  if   isnull ( @userid , '' ) = ''   -- 如果是 Nt验证方式
  begin
  
exec   @err = sp_oasetproperty  @srvid , ' loginsecure ' , 1
  
if   @err <> 0   goto  lberr

  
exec   @err = sp_oamethod  @srvid , ' connect ' , null , @servername
 
end
 
else
  
exec   @err = sp_oamethod  @srvid , ' connect ' , null , @servername , @userid , @password

 
if   @err <> 0   goto  lberr

-- 获取数据库集
  exec   @err = sp_oagetproperty  @srvid , ' databases ' , @dbsid  output
 
if   @err <> 0   goto  lberr

-- 获取要取得脚本的数据库id
  exec   @err = sp_oamethod  @dbsid , ' item ' , @dbid  output, @databasename
 
if   @err <> 0   goto  lberr

-- 获取要取得脚本的对象id
  exec   @err = sp_oamethod  @dbid , ' getobjectbyname ' , @tbid  output, @objectname
 
if   @err <> 0   goto  lberr

-- 取得脚本
  exec   @err = sp_oamethod  @tbid , ' script ' , @re  output
 
if   @err <> 0   goto  lberr

 
-- print @re
  return ( @re )

lberr:
 
exec  sp_oageterrorinfo  NULL @src  out,  @desc  out 
 
declare   @errb   varbinary ( 4 )
 
set   @errb = cast ( @err   as   varbinary ( 4 ))
 
exec  master..xp_varbintohexstr  @errb , @re  out
 
set   @re = ' 错误号:  ' + @re
   
+ char ( 13 ) + ' 错误源:  ' + @src
   
+ char ( 13 ) + ' 错误描述:  ' + @desc
 
return ( @re )
end
go

2、 用法如下
用法如下,

print  dbo.fgetscript( ' 服务器名 ' , ' 用户名 ' , ' 密码 ' , ' 数据库名 ' , ' 表名或其它对象名 ' )

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

declare   @name   varchar ( 250 )
declare  #aa  cursor   for
 
select  name  from  sysobjects  where  xtype  not   in ( ' S ' , ' PK ' , ' D ' , ' X ' , ' L ' )
open  #aa
fetch   next   from  #aa  into   @name
while   @@fetch_status = 0
begin
 
print  dbo.fgetscript( ' onlytiancai ' , ' sa ' , ' sa ' , ' database ' , @name )
 
fetch   next   from  #aa  into   @name
end
close  #aa
deallocate  #aa

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

create   function  getstrarrlength ( @str   varchar ( 8000 ))
returns   int
as
begin
  
declare   @int_return   int
  
declare   @start   int
  
declare   @next   int
  
declare   @location   int
  
select   @str   = ' , ' +   @str   + ' , '
  
select   @str = replace ( @str , ' ,, ' , ' , ' )
  
select   @start   = 1
  
select   @next   = 1  
  
select   @location   =   charindex ( ' , ' , @str , @start )
  
while  ( @location   <> 0 )
  
begin
    
select   @start   =   @location   + 1
    
select   @location   =   charindex ( ' , ' , @str , @start )
    
select   @next   = @next   + 1
  
end
 
select   @int_return   =   @next - 2
 
return   @int_return
end

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

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

3、 测试

SELECT   [ dbo ] . [ getstrarrlength ] ( ' 1,2,3,4,a,b,c,d ' )
SELECT   [ dbo ] . [ getstrofindex ] ( ' 1,2,3,4,a,b,c,d ' , 5 )

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

select   *   from   OPENDATASOURCE ( ' SQLOLEDB ' , ' Data Source=远程ip;User ID=sa;Password=密码 ' ).库名.dbo.表名

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

EXEC  sp_addlinkedserver  ' 别名

你可能感兴趣的:(数据结构,sql,脚本,XP,Go)