SQL SERVER 生成MYSQL建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_MYSQL] Script Date: 06/15/2012 13:05:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*==============================================================
名称: GET_TableScript_MYSQL
功能: 生成单个表的MYSQL脚本
创建:2010年10月22日
参数:@DBNAME --数据库名称
@TBNAME --表名
@SQL --输出脚本
==============================================================*/
ALTER PROCEDURE [dbo].[GET_TableScript_MYSQL] (@DBNAME varchar(40),@TBNAME VARCHAR(100),@SQL VARCHAR(max) OUTPUT) AS 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 ''BIGINT''
when t.xusertype in (175,62,239,59,122,165,173) then c.mysql+'' (''+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.mysql+'' (''+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.mysql+'' (''+convert(varchar(30),isnull(t.prec,''''))+'')''
when t.xusertype in (106,108) then c.mysql+'' (''+convert(varchar(30),isnull(t.prec,''''))+'',''+convert(varchar(30),isnull(t.scale,''''))+'')''
else c.mysql
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)
+'' ALTER COLUMN ''+C.NAME+'' SET default ''+replace(replace(t.text,''('',''''),'')'','''')+'';''+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+''') AND T.text<>''(getdate())''' --mysql不支持函数做默认值
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
SQL SERVER 生成MYSQL建表脚本的更多相关文章
- SQL SERVER 生成ORACLE建表脚本
/****** Object: StoredProcedure [dbo].[GET_TableScript_ORACLE] Script Date: 06/15/2012 13:07:16 **** ...
- oracle 、sql server 、mysql 复制表数据
我们知道在oracle 中复制表数据的方式是使用 create table table_name as select * from table_name 而在sql server 中是不能这么使用的 ...
- SQL Server ->> 生成代码把表字段从NULL改为NOT NULL
一般我们用SELECT .... INTO语句生成的表字段都是允许为NULL.而如果我们需要改成NOT NULL呢 select 'ALTER TABLE dbo.XXXXXXX ALTER COLU ...
- SQL Server 数据库自建表
sysobjects是系统自建的表,里面存储了在数据库内创建的每个对象(约束.默认值.日志.规则.存储过程等). 列名 数据类型 描述 name sysname 对象名 id int 对象标识号 xt ...
- SQL Server ->> 生成Numbers辅助表
if object_id('MyDB.dbo.Numbers') is not null drop table MyDB.dbo.Numbers go use [MyDB] go create tab ...
- 生成建表脚本up_CreateTable
已经很久没用使用这个脚本了,今天用到,并做修改,增加了生成扩展属性功能. Go if object_ID('[up_CreateTable]') is not null Drop Procedure ...
- sql server数据库备份单个表的结构和数据生成脚本
1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...
- sql server数据库备份单个表的结构和数据生成脚本【转】
1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...
- CodeSmith生成SQL Server视图的实体类脚本/对应的生成模板
C#生成sql视图的实体类 using System;using System.Text;using CodeSmith.Engine;using SchemaExplorer;using Syste ...
随机推荐
- 9、网页制作Dreamweaver(jQuery基础:事件)
事件 定义 即当HTML中发生某些事(点击.鼠标移过等)的时候调用的方法 $(selector).action() 触发 事件的触发有两种方法: 1.直接将事件click写在<javascrip ...
- C#不安全代码和stackalloc
stackalloc 关键字用于不安全的代码上下文中,以便在堆栈上分配内存块.如下: ]; 注意:关键字仅在局部变量的初始值中有效. 下面的代码导致编译器错误. int* block; // The ...
- [数据结构]RMQ问题小结
RMQ问题小结 by Wine93 2014.1.14 1.算法简介 RMQ问题可分成以下2种 (1)静态RMQ:ST算法 一旦给定序列确定后就不在更新,只查询区间最大(小)值!这类问题可以用倍增 ...
- 第二个Sprint冲刺第九天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 工作:接着昨天的任务
- nginx源码学习资源(不断更新)
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...
- Linux关机命令
1.halt :关机 init 0 : 关机 shutdown -h now (立刻关机) -h 指的是 halt 2.reboot 重启 init 0 重启 shutdown -r no ...
- centOS7 修改hostname
hostnamectl set-hostname 你要修改到的hostname localectl set-locale LANG=要修改的语言 介绍个Centos 7很不错的教程网站:h ...
- VS2010 安装使用STLPort
VS2010 安装使用STLport 1.本机环境 win7 64位 visual studio 2010 中文旗舰版 STLport-5.2.1.tar.bz2 2.下载STLport http:/ ...
- java 的复用工具 - jar包
前言 Java提供了jar包的机制,使得已经开发好了的类能够顺利的被将来的工程所复用. 本章主要讲解如何使用这种工具. 包的作用 包能够将不同功用的类组织起来,从而确保类名的唯一性. 为了保证包名的唯 ...
- oc小总结
oc的一些总结 下面几个问题是oc中需要掌握的内容 1.如何掌握一个方法的方法名 2.一个对象调用一个autorelease,什么时候释放 3.字典和数组,集合都有什么特点 4.如何定义一个类 5.类 ...