zoukankan      html  css  js  c++  java
  • Sqlserver 创建表角本

    USE [BusinessSystemDB]
    GO
    /****** Object:  StoredProcedure [dbo].[GET_TableScript_MSSQL]    Script Date: 09/17/2018 17:51:50 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    /*==============================================================
    名称: GET_TableScript_MSSQL
    功能: 获取customize单个表的mysql脚本 
    创建:2010年5月12日
    参数:@DBNAME   --数据库名称
          @TBNAME   --表名
          @SQL      --输出脚本
    ==============================================================*/
    CREATE PROCEDURE [dbo].[GET_TableScript_MSSQL] (@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.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('''+@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 ''+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('''+@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)+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)
            +'' ''+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
    

      2、根据存储过程获取查询脚本

    DECLARE @SQL NVARCHAR(3000) 
    EXEC GET_TableScript_MSSQL 'BusinessSystemDB','Swb_Yw_KeHuBase',@SQL OUT
    SELECT @SQL
    

      3、单独执行Sql,返回表结构角本

    DECLARE @table NVARCHAR(40)
    SET @table = 'Customer'
    DECLARE @table_script NVARCHAR(MAX)
     --建表的脚本
    DECLARE @head NVARCHAR(MAX)
    SET @head = 'CREATE TABLE ' + @table + '
    (' + CHAR(13) + CHAR(10) ;
    
    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(@table)
    ORDER BY t.COLID ; 
    
    SELECT  @head + SUBSTRING(@table_script, 1,
                                              LEN(@table_script) - 3) + CHAR(13)
            + CHAR(10) + ')' + CHAR(13) + CHAR(10) + ' ' + CHAR(13) + CHAR(10)
            + CHAR(13) + CHAR(10)
    

      MySql中增加时间戳字段时,可以复制引句,加在最后面:

    update_timestamp  timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

  • 相关阅读:
    BZOJ 2152 聪聪可可
    hdu 1028 && hdu 1398 && hdu 1085 && hdu 1171 ——生成函数
    bzoj 4827 [Hnoi2017]礼物——FFT
    bzoj 4503 两个串——FFT
    bzoj 3527 [Zjoi2014]力——FFT
    bzoj 3160 万径人踪灭——FFT
    bzoj 2194 快速傅立叶之二
    bzoj 2179 FFT快速傅立叶
    洛谷 3803 【模板】多项式乘法(FFT)
    CF 622F The Sum of the k-th Powers——拉格朗日插值
  • 原文地址:https://www.cnblogs.com/footleg/p/12420323.html
Copyright © 2011-2022 走看看