设为首页 收藏本站
查看: 1182|回复: 3

[经验分享] SQL SERVER 生成ORACLE建表脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-12-27 09:03:24 | 显示全部楼层 |阅读模式

[SQL] 纯文本查看 复制代码
/****** 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;



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-12484-1-1.html 上篇帖子: SQL SERVER 只有MDF文件的恢复 下篇帖子: SQL SERVER 生成MYSQL建表脚本

尚未签到

发表于 2014-1-1 11:25:29 | 显示全部楼层
¤、说爱一个不需要任何理由,为何还要离去。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-3 07:30:47 | 显示全部楼层
寂寞冷漠难过昨是今非真的假的由不得我

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

尚未签到

发表于 2014-1-5 04:03:43 | 显示全部楼层
他的冷漠,让我知道自己是该放开了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表