程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 一些t-sql技巧

一些t-sql技巧

編輯:關於SqlServer

  一、 只復制一個表結構,不復制數據

  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

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 下一頁
  • 尾頁
  • 共3頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved