一、 只復制一個表結構,不復制數據
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