• SqlServer2008根据现有表,获取该表的分区创建脚本


      1 *==============================================================
      2 名称: [GetMSSQLTableScript]
      3 功能: 获取customize单个表的mysql脚本 
      4 创建:2015年3月23日
      5 参数:@DBName            --数据库名称
      6       @TBName            --表名
      7       @SchemeName        --数据库表引用的Scheme
      8       @PartitionScheme    --分区Scheme
      9       @PartitionField    --该表使用的分区字段      
     10       @SQL                --输出脚本
     11 ==============================================================*/
     12 ALTER PROCEDURE [Tuning].[GetMSSQLTableScript] (
     13     @DBName nvarchar(64),
     14     @SchemeName nvarchar(32),
     15     @TBName nvarchar(128),    
     16     @PartitionScheme nvarchar(32),
     17     @PartitionField nvarchar(32),    
     18     @SQL nvarchar(max) OUTPUT
     19 )
     20 AS  
     21 Begin
     22     declare @table_script nvarchar(max) --建表的脚本
     23     declare @index_script nvarchar(max) --索引的脚本
     24     declare @default_script nvarchar(max) --默认值的脚本
     25     declare @check_script nvarchar(max) --check约束的脚本
     26     declare @sql_cmd nvarchar(max)  --动态SQL命令
     27     declare @err_info varchar(200)
     28     set @TBName = UPPER(@TBName);
     29     if OBJECT_ID(@DBName+'.'+@SchemeName+'.'+@TBName) is null
     30     BEGIN
     31         set @err_info='对象:'+@DBName+'.'+@SchemeName+'.'+@TBName+'不存在!'
     32         raiserror(@err_info,16,1)
     33         return
     34     END
     35 
     36     ----------------------生成创建表脚本----------------------------
     37     --1.添加算定义字段
     38     set @table_script = 'CREATE TABLE '+@SchemeName+'.'+@TBName+'
     39     ('+char(13)+char(10);
     40      
     41      
     42     --添加表中的其它字段
     43     set @sql_cmd=N'
     44     use '+@DBName+'
     45     set @table_script='''' 
     46     select @table_script=@table_script+
     47             '' [''+t.NAME+''] ''
     48             +(case when t.xusertype in (175,62,239,59,122,165,173) then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')''
     49                   when t.xusertype in (231) and t.length=-1 then ''[ntext]''
     50                   when t.xusertype in (231) and t.length<>-1 then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')''
     51                  when t.xusertype in (167) and t.length=-1 then ''[text]''
     52                   when t.xusertype in (167) and t.length<>-1 then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'')''
     53                   when t.xusertype in (106,108) then ''[''+p.name+''] (''+convert(varchar(30),isnull(t.prec,''''))+'',''+convert(varchar(30),isnull(t.scale,''''))+'')''
     54                   else ''[''+p.name+'']''
     55              END)
     56              +(case when t.isnullable=1 then '' null'' else '' not null ''end)
     57              +(case when COLUMNPROPERTY(t.ID, t.NAME, ''ISIDENTITY'')=1 then '' identity'' else '''' end)
     58              +'',''+char(13)+char(10)
     59     from syscolumns t join systypes p  on t.xusertype = p.xusertype
     60     where t.ID=OBJECT_ID('''+@SchemeName+'.'+@TBName+''')
     61     ORDER BY  t.COLID; 
     62     '
     63     EXEc sp_executesql @sql_cmd,N'@table_script varchar(max) output',@sql_cmd output
     64     set @table_script=@table_script+@sql_cmd
     65     IF len(@table_script)>0
     66         set @table_script=substring(@table_script,1,len(@table_script)-3)+char(13)+char(10)
     67             +')On '+@PartitionScheme+'('+@PartitionField+')
     68             '+char(13)+char(10)
     69             --+'GO'
     70             +char(13)+char(10)+char(13)+char(10)
     71         
     72     --------------------生成索引脚本---------------------------------------
     73     set @index_script=''
     74     set @sql_cmd=N'
     75     use '+@DBName+'
     76     declare @ct int
     77     declare @scheme nvarchar(32)
     78     declare @indid int      --当前索引ID
     79     declare @p_indid int    --前一个索引ID
     80     declare @partitionField nvarchar(32)
     81     set @partitionField='''+@PartitionField+'''
     82     select @indid=-1, @p_indid=0,@ct=0    --初始化,以后用@indid和@p_indid判断是否索引ID发生变化
     83     set @index_script=''''
     84     set @scheme='''+@SchemeName+'''
     85     select @indid=INDID
     86         ,@index_script=@index_script
     87         +(case when @indid<>@p_indid and @ct>0 
     88             then '')''+char(13)+char(10)    +char(13)+char(10)
     89             else '''' 
     90         end)
     91         +(case when @indid<>@p_indid and UNIQ=''PRIMARY KEY'' 
     92               then ''ALTER TABLE ''+TABNAME+'' ADD CONSTRAINT ''+name+'' PRIMARY KEY ''+cluster+char(13)+char(10)+''(''+char(13)+char(10)+''    ''+COLNAME+'',''+@partitionField+char(13)+char(10)
     93               when @indid<>@p_indid and UNIQ=''UNIQUE'' 
     94               then ''ALTER TABLE ''+TABNAME+'' ADD CONSTRAINT ''+name+'' UNIQUE ''+cluster+char(13)+char(10)+''(''+char(13)+char(10)+''    ''+COLNAME+'',''+@partitionField+char(13)+char(10)
     95               when @indid<>@p_indid and UNIQ=''INDEX''     
     96               then ''CREATE ''+cluster+'' INDEX ''+name+'' ON ''+TABNAME+char(13)+char(10)+''(''+char(13)+char(10)+''    ''+COLNAME+char(13)+char(10)
     97               when @indid=@p_indid
     98               then  ''    ,''+COLNAME+char(13)+char(10)
     99          end)
    100         ,@ct=@ct+1
    101         ,@p_indid=@indid
    102     from 
    103     (
    104         SELECT A.INDID,B.KEYNO
    105             ,NAME,@scheme+''.''+(SELECT NAME FROM SYSOBJECTS WHERE ID=A.ID) AS TABNAME,
    106             (SELECT NAME FROM SYSCOLUMNS WHERE ID=B.ID AND COLID=B.COLID) AS COLNAME,
    107             (CASE WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE=''UQ'') THEN ''UNIQUE'' 
    108                   WHEN EXISTS(SELECT 1 FROM SYSOBJECTS WHERE NAME=A.NAME AND XTYPE=''PK'') THEN ''PRIMARY KEY''
    109                   ELSE ''INDEX'' END)  AS UNIQ,
    110             (CASE WHEN A.INDID=1 THEN ''CLUSTERED'' WHEN A.INDID>1 THEN ''NONCLUSTERED'' END) AS CLUSTER
    111         FROM SYSINDEXES A INNER JOIN SYSINDEXKEYS B ON A.INDID=B.INDID AND A.ID=B.ID
    112         WHERE A.ID=OBJECT_ID('''+@SchemeName+'.'+@TBName+''') and a.indid<>0 /*如果该表是一个分区表,就必须添加条件:and b.keyno<>0*/
    113     ) t
    114     ORDER BY INDID,KEYNO'
    115     EXEc sp_executesql @sql_cmd,N'@index_script varchar(max) output',@sql_cmd output
    116     set @index_script=@sql_cmd
    117     IF len(@index_script)>0
    118         set @index_script=@index_script+')'+char(13)+char(10)
    119         --+'go'
    120         +char(13)+char(10)+char(13)+char(10)
    121     --生成默认值约束
    122     set @sql_cmd='
    123     use '+@DBName+'
    124     declare @scheme nvarchar(32)
    125     declare @partitionField nvarchar(32)
    126     set @partitionField='''+@PartitionField+'''
    127     set @scheme='''+@SchemeName+'''
    128     set @default_script=''''
    129     SELECT @default_script=@default_script
    130             +''ALTER TABLE ''+@scheme+''.''+OBJECT_NAME(O.PARENT_OBJ)
    131             +'' ADD CONSTRAINT ''+O.NAME+'' default ''+t.text+'' for ''+C.NAME+char(13)+char(10)+char(13)+char(10)
    132     FROM SYSOBJECTS O INNER JOIN SYSCOMMENTS T ON O.ID=T.ID
    133         INNER JOIN SYSCOLUMNS C ON O.PARENT_OBJ=C.ID AND C.CDEFAULT=T.ID
    134     WHERE O.XTYPE=''D'' AND O.PARENT_OBJ=OBJECT_ID('''+@SchemeName+'.'+@TBName+''')'
    135     EXEc sp_executesql @sql_cmd,N'@default_script varchar(max) output',@sql_cmd output
    136     set @default_script=@sql_cmd+char(13)+char(10)
    137 
    138     set @SQL=@table_script+@index_script+@default_script
    139     declare @len int,@n int
    140     set @len=LEN(@SQL)
    141     set @n=0
    142     while(@len>0)
    143     BEGIN
    144       PRINT(substring(@SQL,@n*4000+1,4000));
    145       set @n=@n+1
    146       set @len=@len-4000;
    147     END
    148 End

    该函数的原创作者:http://www.cnblogs.com/champaign/p/3492510.html

    本人及修改了一部分内容,让该存储过程更灵活点。

    公司DBA支持给建议不要用sysindexkeys来查找对应的列,而是使用syscolumns来提到:

    比如:select * from syscolumns where id=object_id('dx.Article');

     select * from sys.index_columns where object_id=object_id('dx.Article');

  • 相关阅读:
    linux | 一次网卡故障处理
    KVM | centos 安装 window 虚拟机
    DNS | named.run文件很大的处理方法
    01
    802.11X用户身份验证
    802.11有线等效加密WEP
    802.11成帧细节
    802.11 MAC基础
    【转载】我为什么放弃了 Linux 内核学习?
    Linux网络编程(一):一个简单的socket程序
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/4359939.html
Copyright © 2020-2023  润新知