SQL SERVER 生成建表脚本

ゝ一纸荒年。 2021-06-26 16:06 632阅读 0赞

直接sql输出

  1. SET ansi_nulls ON
  2. SET quoted_identifier ON
  3. DECLARE @DBNAME VARCHAR(40),
  4. @TBNAME VARCHAR(100),
  5. @SQL VARCHAR(max)
  6. SET @DBNAME='O2Odb';
  7. SET @TBNAME='order';
  8. DECLARE @table_script NVARCHAR(max) --建表的脚本
  9. DECLARE @index_script NVARCHAR(max) --索引的脚本
  10. DECLARE @default_script NVARCHAR(max) --默认值的脚本
  11. DECLARE @check_script NVARCHAR(max) --check约束的脚本
  12. DECLARE @sql_cmd NVARCHAR(max) --动态SQL命令
  13. DECLARE @err_info VARCHAR(200)
  14. SET @tbname = Upper(@tbname);
  15. IF Object_id(@DBNAME + '.dbo.' + @TBNAME) IS NULL
  16. BEGIN
  17. SET @err_info='对象:' + @DBNAME + '.dbo.' + @TBNAME
  18. + '不存在!'
  19. RAISERROR(@err_info,16,1)
  20. RETURN
  21. END
  22. ----------------------生成创建表脚本----------------------------
  23. --1.添加算定义字段
  24. SET @table_script = 'CREATE TABLE ' + @TBNAME
  25. + ' (' + Char(13)
  26. + Char(10);
  27. --添加表中的其它字段
  28. SET @sql_cmd=N' use ' + @DBNAME
  29. + ' set @table_script='''' select @table_script=@table_script+ '' [''+t.NAME+''] '' +(case when t.xusertype in (175,62,239,59,122,165,173) then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (231) and t.length=-1 then ''[ntext]'' when t.xusertype in (231) and t.length<>-1 then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (167) and t.length=-1 then ''[text]'' when t.xusertype in (167) and t.length<>-1 then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (106,108) then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'',''+convert(varchar(30),isnull(t.scale,''''))+'')'' else ''[''+p.name+'']'' 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 where t.ID=OBJECT_ID('''
  30. + @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) + 'GO' + Char(13) + Char(10) + Char(13) + Char(10) --------------------生成索引脚本--------------------------------------- SET @index_script=''
  31. SET @sql_cmd=N' use ' + @DBNAME
  32. + ' 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)+''go''+char(13)+char(10) else '''' end) +(case when @indid<>@p_indid and UNIQ=''PRIMARY KEY'' then ''ALTER TABLE ''+TABNAME+'' ADD CONSTRAINT ''+name+'' PRIMARY KEY ''+cluster+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 ''+cluster+char(13)+char(10) +''(''+char(13)+char(10) +'' ''+COLNAME+char(13)+char(10) when @indid<>@p_indid and UNIQ=''INDEX'' then ''CREATE ''+cluster+'' 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('''
  33. + @TBNAME
  34. + ''') 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) + 'go' + 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) +'' ADD CONSTRAINT ''+O.NAME+'' default ''+t.text+'' for ''+C.NAME+char(13)+char(10) +''GO''+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('''
  35. + @TBNAME + ''')' EXEC Sp_executesql @sql_cmd, N'@default_script varchar(max) output',
  36. @sql_cmd output
  37. SET @default_script=@sql_cmd + Char(13) + Char(10)
  38. SET @SQL=@table_script + @index_script
  39. + @default_script
  40. DECLARE @len INT,
  41. @n INT
  42. SET @len=Len(@SQL)
  43. SET @n=0
  44. WHILE( @len > 0 )
  45. BEGIN
  46. --PRINT(substring(@SQL,@n*4000+1,4000));
  47. SELECT @SQL;
  48. SET @n=@n + 1
  49. SET @len=@len - 4000;
  50. END

存储过程方式生成

  1. SET ansi_nulls ON
  2. go
  3. SET quoted_identifier ON
  4. go
  5. /*============================================================== 名称: GET_TableScript_MSSQL 功能: 获取customize单个表的mysql脚本 创建:2010年5月12日 参数:@DBNAME --数据库名称 @TBNAME --表名 @SQL --输出脚本 ==============================================================*/
  6. ALTER PROCEDURE [dbo].[Get_tablescript_mssql] (@DBNAME VARCHAR(40),
  7. @TBNAME VARCHAR(100),
  8. @SQL VARCHAR(max) output)
  9. AS
  10. DECLARE @table_script NVARCHAR(max) --建表的脚本
  11. DECLARE @index_script NVARCHAR(max) --索引的脚本
  12. DECLARE @default_script NVARCHAR(max) --默认值的脚本
  13. DECLARE @check_script NVARCHAR(max) --check约束的脚本
  14. DECLARE @sql_cmd NVARCHAR(max) --动态SQL命令
  15. DECLARE @err_info VARCHAR(200)
  16. SET @tbname = Upper(@tbname);
  17. IF Object_id(@DBNAME + '.dbo.' + @TBNAME) IS NULL
  18. BEGIN
  19. SET @err_info='对象:' + @DBNAME + '.dbo.' + @TBNAME
  20. + '不存在!'
  21. RAISERROR(@err_info,16,1)
  22. RETURN
  23. END
  24. ----------------------生成创建表脚本----------------------------
  25. --1.添加算定义字段
  26. SET @table_script = 'CREATE TABLE ' + @TBNAME + ' (' + Char(13) + Char(10);
  27. --添加表中的其它字段
  28. SET @sql_cmd=N' use ' + @DBNAME + ' set @table_script='''' select @table_script=@table_script+ '' [''+t.NAME+''] '' +(case when t.xusertype in (175,62,239,59,122,165,173) then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (231) and t.length=-1 then ''[ntext]'' when t.xusertype in (231) and t.length<>-1 then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (167) and t.length=-1 then ''[text]'' when t.xusertype in (167) and t.length<>-1 then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')'' when t.xusertype in (106,108) then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'',''+convert(varchar(30),isnull(t.scale,''''))+'')'' else ''[''+p.name+'']'' 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 where t.ID=OBJECT_ID('''
  29. + @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) + 'GO' + Char(13) + Char(10) + Char(13) + Char(10) --------------------生成索引脚本--------------------------------------- SET @index_script=''
  30. 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)+''go''+char(13)+char(10) else '''' end) +(case when @indid<>@p_indid and UNIQ=''PRIMARY KEY'' then ''ALTER TABLE ''+TABNAME+'' ADD CONSTRAINT ''+name+'' PRIMARY KEY ''+cluster+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 ''+cluster+char(13)+char(10) +''(''+char(13)+char(10) +'' ''+COLNAME+char(13)+char(10) when @indid<>@p_indid and UNIQ=''INDEX'' then ''CREATE ''+cluster+'' 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('''
  31. + @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) + 'go' + 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) +'' ADD CONSTRAINT ''+O.NAME+'' default ''+t.text+'' for ''+C.NAME+char(13)+char(10) +''GO''+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',
  32. @sql_cmd output
  33. SET @default_script=@sql_cmd + Char(13) + Char(10)
  34. SET @SQL=@table_script + @index_script
  35. + @default_script
  36. DECLARE @len INT,
  37. @n INT
  38. SET @len=Len(@SQL)
  39. SET @n=0
  40. WHILE( @len > 0 )
  41. BEGIN
  42. PRINT( Substring(@SQL, @n * 4000 + 1, 4000) );
  43. SET @n=@n + 1
  44. SET @len=@len - 4000;
  45. END

发表评论

表情:
评论列表 (有 0 条评论,632人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SQL Server SQL脚本

    本节的主要内容是要教大家怎么通过编写 SQL 脚本来查询、更新并且运行数据库。 利用 SQL 脚本我们能做很多事情,比如插入数据、读取数据、更新数据以及删除数据等;它们也可以

    相关 cmd 执行sql脚本 sql server

    工作中遇到,当使用Sql Server管理器生成数据库脚本,由于脚本文件太大,导致不能使用Sql Server管理器执行或者无法打开sql脚本,此时就可以使用命令行执行sql脚

    相关 SpringBoot生成sql脚本

    前言 最近项目新增加了一个导入导出的功能,起因是因为项目需要迁移环境,项目的业务需要所有的页面都是可配置的,当我在测试环境配置好一套页面,并且测试无误后,需要把我配置好的

    相关 SQL Server SQL脚本

    SQL Server SQL脚本 本节的主要内容是要教大家怎么通过编写 SQL 脚本来查询、更新并且运行数据库。 利用 SQL 脚本我们能做很多事情,比如插入数据、读取数...