SQL SERVER 生成ORACLE建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_ORACLE] Script Date: 06/15/2012 13:07:16 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /*============================================================== 名称: GET_TableScript_ORACLE 功能: 生成单个表的ORACLE脚本 创建:2010年10月22日 参数:@DBNAME --数据库名称 @TBNAME --表名 @SQL --输出脚本 ==============================================================*/ ALTER PROCEDURE [dbo].[GET_TableScript_ORACLE] (@DBNAME varchar(40),@TBNAME VARCHAR(100),@SQL VARCHAR(max) OUTPUT) AS BEGIN declare @table_script nvarchar(max) --建表的脚本 declare @index_script nvarchar(max) --索引的脚本 declare @default_script nvarchar(max) --默认值的脚本 declare @check_script nvarchar(max) --check约束的脚本 declare @sql_cmd nvarchar(max) --动态SQL命令 declare @err_info varchar(200) set @tbname = UPPER(@tbname); if OBJECT_ID(@DBNAME+'.dbo.'+@TBNAME) is null BEGIN set @err_info='对象:'+@DBNAME+'.dbo.'+@TBNAME+'不存在!' raiserror(@err_info,16,1) return END ----------------------生成创建表脚本---------------------------- --1.添加算定义字段 set @table_script = 'CREATE TABLE '+@TBNAME+' ('+char(13)+char(10); --添加表中的其它字段 set @sql_cmd=N' use '+@DBNAME+' set @table_script='''' select @table_script=@table_script+ +t.NAME+'' '' +(case when t.name=''GENIUS_UID'' then ''number(20,0)'' when t.xusertype in (175,62,239,59,122,165,173) then c.oracle+'' (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (231) and t.length=-1 then ''BLOB'' when t.xusertype in (231) and t.length<>-1 then c.oracle+'' (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (167) and t.length=-1 then ''BLOB'' when t.xusertype in (167) and t.length<>-1 then c.oracle+'' (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (106,108) then c.oracle+'' (''+convert(varchar(30),isnull(t.prec,''''))+'',''+convert(varchar(30),isnull(t.scale,''''))+'')'' when t.xusertype in (48,52,56,104,127,189) then ''number(''+c.ora_prec+'',0)'' else c.oracle END) +(case when t.isnullable=1 then '' null'' else '' not null ''end) +(case when COLUMNPROPERTY(t.ID, t.NAME, ''ISIDENTITY'')=1 then '' identity'' else '''' end) +'',''+char(13)+char(10) from syscolumns t join systypes p on t.xusertype = p.xusertype inner join pubdb..DB_TYPES c on p.xtype=c.user_type_id where t.ID=OBJECT_ID('''+@TBNAME+''') ORDER BY t.COLID; ' EXEc sp_executesql @sql_cmd,N'@table_script varchar(max) output',@sql_cmd output set @table_script=@table_script+@sql_cmd IF len(@table_script)>0 set @table_script=substring(@table_script,1,len(@table_script)-3)+char(13)+char(10) +');'+char(13)+char(10) +char(13)+char(10)+char(13)+char(10) --------------------生成索引脚本--------------------------------------- set @index_script='' set @sql_cmd=N' use '+@DBNAME+' declare @ct int declare @indid int --当前索引ID declare @p_indid int --前一个索引ID select @indid=-1, @p_indid=0,@ct=0 --初始化,以后用@indid和@p_indid判断是否索引ID发生变化 set @index_script='''' select @indid=INDID ,@index_script=@index_script +(case when @indid<>@p_indid and @ct>0 then '');''+char(13)+char(10)+char(13)+char(10) else '''' end) +(case when @indid<>@p_indid and UNIQ=''PRIMARY KEY'' then ''ALTER TABLE ''+TABNAME+'' ADD CONSTRAINT ''+name+'' PRIMARY KEY ''+char(13)+char(10) +''(''+char(13)+char(10) +'' ''+COLNAME+char(13)+char(10) when @indid<>@p_indid and UNIQ=''UNIQUE'' then ''ALTER TABLE ''+TABNAME+'' ADD CONSTRAINT ''+name+'' UNIQUE ''+char(13)+char(10) +''(''+char(13)+char(10) +'' ''+COLNAME+char(13)+char(10) when @indid<>@p_indid and UNIQ=''INDEX'' then ''CREATE INDEX ''+name+'' ON ''+TABNAME+char(13)+char(10) +''(''+char(13)+char(10) +'' ''+COLNAME+char(13)+char(10) when @indid=@p_indid then '' ,''+COLNAME+char(13)+char(10) END) ,@ct=@ct+1 ,@p_indid=@indid from ( SELECT A.INDID,B.KEYNO ,NAME,(SELECT NAME FROM SYSOBJECTS WHERE ID=A.ID) AS TABNAME, (SELECT NAME FROM SYSCOLUMNS WHERE ID=B.ID AND COLID=B.COLID) AS COLNAME, (CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE=''UQ'') THEN ''UNIQUE'' WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE=''PK'') THEN ''PRIMARY KEY'' ELSE ''INDEX'' END) AS UNIQ, (CASE WHEN A.INDID=1 THEN ''CLUSTERED'' WHEN A.INDID>1 THEN ''NONCLUSTERED'' END) AS CLUSTER FROM SYSINDEXES A INNER JOIN SYSINDEXKEYS B ON A.INDID=B.INDID AND A.ID=B.ID WHERE A.ID=OBJECT_ID('''+@TBNAME+''') and a.indid<>0 ) t ORDER BY INDID,KEYNO' EXEc sp_executesql @sql_cmd,N'@index_script varchar(max) output',@sql_cmd output set @index_script=@sql_cmd IF len(@index_script)>0 set @index_script=@index_script+');'+char(13)+char(10)+char(13)+char(10) --生成默认值约束 set @sql_cmd=' use '+@DBNAME+' set @default_script='''' SELECT @default_script=@default_script +''ALTER TABLE ''+OBJECT_NAME(O.PARENT_OBJ) +'' MODIFY ''+C.NAME+'' default ''+replace(t.text,''(getdate())'',''(sysdate)'')+'';''+char(13)+char(10) +char(13)+char(10) FROM SYSOBJECTS O INNER JOIN SYSCOMMENTS T ON O.ID=T.ID INNER JOIN SYSCOLUMNS C ON O.PARENT_OBJ=C.ID AND C.CDEFAULT=T.ID WHERE O.XTYPE=''D'' AND O.PARENT_OBJ=OBJECT_ID('''+@TBNAME+''')' EXEc sp_executesql @sql_cmd,N'@default_script varchar(max) output',@sql_cmd output set @default_script=@sql_cmd+char(13)+char(10) set @SQL=@table_script+@index_script+@default_script declare @len int,@n int set @len=LEN(@SQL) set @n=0 while(@len>0) BEGIN PRINT(substring(@SQL,@n*4000+1,4000)); set @n=@n+1 set @len=@len-4000; END END;