您的位置:首页 > 数据库

SQL SERVER 生成表结构的语句

2015-09-01 15:44 921 查看
--获取表结构创建脚本
Alter Proc sp_SYS_CreateTableSQL_Struct(@TableName sysname)
AS
SET NOCOUNT ON      DECLARE @ObjectID int
DECLARE @TableScript Table(Iden Int IDENTITY(1, 1) ,ScriptLine nvarchar(4000))
SET @ObjectID = object_id(@TableName)
IF @ObjectID IS NULL OR OBJECTPROPERTY(@ObjectID, 'IsTable') = 0
BEGIN
RAISERROR('指定的对象不是表对象', 16, 1)
RETURN
END           --获取表的创建脚本

--插入表头
INSERT INTO @TableScript(ScriptLine)
SELECT 'Create Table ' + USER_NAME(OBJECTPROPERTY(@ObjectID, 'OwnerId')) + '.' + object_name(@ObjectID) + '('       --插入字段      INSERT INTO @TableScript(ScriptLine)      SELECT   ' ' + a.Name + ' ' + b.name + '' +           CASE WHEN c.Object_id IS NOT NULL THEN ' Identity(' +  CONVERT(nvarchar, c.seed_value) + ', ' + CONVERT(nvarchar, c.increment_value) + ')'            ELSE '' END +         CASE WHEN b.xusertype IN (167, 175, 231, 239) THEN '(' + CONVERT(nvarchar, a.prec) + ')'          WHEN b.xusertype in (106, 108) THEN  '(' + CONVERT(nvarchar, a.xprec) + ',   ' + CONVERT(nvarchar, a.xscale) + ')'         ELSE '' END +         CASE a.isnullable WHEN 1 THEN '' ELSE ' Not' END + ' Null' +        CASE WHEN d.Name IS NOT NULL THEN ' Default' + d.Definition ELSE '' END +         ','        FROM sys.syscolumns a       LEFT JOIN sys.systypes b ON a.xusertype = b.xusertype       LEFT JOIN sys.identity_columns c ON c.Object_id = a.ID AND c.Column_ID = a.ColID       LEFT JOIN sys.default_constraints d ON d.Parent_Object_ID = a.ID AND d.Parent_column_ID = a.ColID     WHERE a.[ID] = @ObjectID     ORDER BY a.ColOrder       --插入主键和索引
 DECLARE @IndexID int, @IndexScript nvarchar(4000)      
 DECLARE IndexCursor CURSOR FOR        
 SELECT b.object_id, '    Constraint ' + a.Name + N' ' +      
  CASE a.Type WHEN 'PK' THEN 'Primary Key ' WHEN 'UQ' THEN 'UNIQUE ' END +        CASE b.Type WHEN 1  THEN 'CLUSTERED' WHEN 2 THEN 'NONCLUSTERED ' END + '('     FROM sys.key_constraints a    
  LEFT JOIN sys.indexes b ON b.Object_ID = a.Parent_Object_ID AND b.index_id = a.unique_index_id    
 WHERE a.Parent_Object_ID = @ObjectID      
 OPEN IndexCursor    
 FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript      
 WHILE @@FETCH_STATUS = 0     BEGIN    
  SELECT @IndexScript = @IndexScript + INDEX_COL(object_name(OBJECT_ID), 2, 1) + ', '    
  FROM sys.index_columns      
  WHERE Object_ID = @IndexID --AND Index_ID = 2     
  SET @IndexScript = LEFT(@IndexScript, LEN(@IndexScript) - 1) + '),'      INSERT INTO @TableScript(ScriptLine) VALUES(@IndexScript)     
  FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript     END      
 CLOSE IndexCursor    
 DEALLOCATE IndexCursor     
 --除去最后一个,号    
 UPDATE  @TableScript      
     SET ScriptLine = LEFT(ScriptLine, LEN(ScriptLine) - 1)     WHERE Iden = (SELECT MAX(Iden) FROM @TableScript)      
 INSERT INTO @TableScript(ScriptLine) VALUES(')')     INSERT INTO @TableScript(ScriptLine) VALUES('GO')     INSERT INTO @TableScript(ScriptLine) VALUES('')      
 --获取表备注(表字段说明/表说明)   /*   
 DECLARE  @PropScript nvarchar(4000)     INSERT INTO @TableScript(ScriptLine)    
 SELECT N'EXEC sys.sp_addextendedproperty @name = N''' + a.Name + N''', @value 

= N''' + CONVERT(nvarchar, a.Value)    
   + N''', @level0type = N''SCHEMA'', @level0name = N''' + USER_NAME(OBJECTPROPERTY(a.major_Id, N'OwnerId'))   
   + N''', @level1type = N''TABLE'', @level1name = N''' + b.Name + N''''     FROM sys.extended_properties a    
 LEFT JOIN sys.objects b ON b.[Object_ID] = a.major_Id     WHERE a.major_Id = @ObjectID     AND Minor_ID = 0         
 INSERT INTO @TableScript(ScriptLine) VALUES('GO')     
 DECLARE PropCursor CURSOR FOR      
 SELECT N'EXEC sys.sp_addextendedproperty @name = N''' + a.Name + N''', @value = N''' + CONVERT(nvarchar, a.Value)  
  + N''', @level0type = N''SCHEMA'', @level0name = N''' + USER_NAME(OBJECTPROPERTY(a.major_Id, N'OwnerId'))  
  + N''', @level1type = N''TABLE'', @level1name = N''' + b.Name + N''''      + N', @level2type = N''COLUMN'', @level2name = N''' + c.[Name] + N''''     FROM sys.extended_properties a    
  LEFT JOIN sys.objects b ON b.[Object_ID] = a.major_Id    
  LEFT JOIN sys.syscolumns c ON c.[ID] = a.major_Id AND c.ColID = a.Minor_ID     WHERE a.major_Id = @ObjectID AND Minor_ID <> 0      
 OPEN PropCursor    
 FETCH NEXT FROM PropCursor INTO @PropScript      
 WHILE @@FETCH_STATUS = 0     BEGIN    
  INSERT INTO @TableScript(ScriptLine) VALUES(@PropScript)      INSERT INTO @TableScript(ScriptLine) VALUES(N'GO')     
  FETCH NEXT FROM PropCursor INTO @PropScript     END    
 CLOSE PropCursor    
 DEALLOCATE PropCursor    
 INSERT INTO @TableScript(ScriptLine) VALUES('')      */   
 --获取表外键    
 DECLARE @ConstID int, @i tinyint, @keyCnt tinyint, @TempletSQL nvarchar(400), @SQLScript nvarchar(500),    
  @FColName sysname, @RColName sysname,    
  @ForeignLine nvarchar(4000), @ReferencesLine nvarchar(4000), @ReferencesAction nvarchar(4000)    

 DECLARE @ConstIDTable table(ConstID   int)     SELECT @FColName = '', @RColName = '',    
  @TempletSQL = N'SELECT @eFColName = ''['' + col_name(FkeyID, Fkey%d) + '']'', @eRColName = ''['' ' 
              + N' + col_name(RkeyID, Rkey%d) + '']'' FROM sys.sysreferences WHERE ConstID = @ConstID '     
 INSERT INTO @ConstIDTable    
 SELECT ConstID FROM sys.sysreferences WHERE FKeyID = @ObjectID OR RKeyID = @ObjectID ORDER BY FKeyID     
 WHILE EXISTS(SELECT * FROM @ConstIDTable)     BEGIN    
  SELECT TOP 1 @ConstID = ConstID FROM @ConstIDTable      DELETE FROM @ConstIDTable WHERE ConstID = @ConstID     
  INSERT INTO @TableScript    
  SELECT N'--ALTER TABLE [dbo].[' + object_name(FKeyID) + '] WITH CHECK'      FROM sys.sysreferences      WHERE ConstID = @ConstID       
  INSERT INTO @TableScript(ScriptLine) VALUES('--ADD' + CHAR(13) + CHAR(10))     
  SELECT @ForeignLine = N'--Constraint ' + object_name(ConstID) + ' Foreign Key(',      
   @ReferencesLine = N'REFERENCES [dbo].[' + object_name(RKeyID) + '] (',         @ReferencesAction = CASE b.Delete_Referential_Action WHEN 0 THEN N''                       WHEN 1 THEN N'ON DELETE Cascade'    
                 WHEN 2 THEN N'ON DELETE SET NULL'    
                 WHEN 3 THEN N'ON DELETE SET DEFAULT'    
        END + '   ' +    
        CASE b.Delete_Referential_Action WHEN 0 THEN N''                          WHEN 1 THEN N'ON UPDATE Cascade'    
                    WHEN 2 THEN N'ON UPDATE SET NULL'    
                    WHEN 3 THEN N'ON UPDATE SET DEFAULT'    
        END,       @keyCnt = KeyCnt        FROM sys.sysreferences a    
   LEFT JOIN sys.foreign_keys b ON a.ConstID = b.Object_ID    

  WHERE a.ConstID = @ConstID     
  --取字段      SET @i = 1    
  WHILE @i <= @keyCnt      BEGIN    
   SET @SQLScript = REPLACE(@TempletSQL, '%d', CONVERT(nvarchar, @i))       EXEC sp_executesql @stmt = @SQLScript, @params = N'@eFColName sysname output, @eRColName sysname output, @ConstID int',      
          @eFColName = @FColName output, @eRColName = @RColName output, @ConstID = @ConstID       print @SQLScript    
   SET @ForeignLine = @ForeignLine + CASE WHEN @i > 1 THEN ', ' ELSE '' END + @FColName    
   SET @ReferencesLine = @ReferencesLine + CASE WHEN @i > 1 THEN ',   ' ELSE '' END + @RColName       SET @i = @i + 1      END     
  INSERT INTO @TableScript(ScriptLine) VALUES(@ForeignLine + N')   ' + @ReferencesLine + N')')       
  IF  @ReferencesAction <> ''    
   INSERT INTO @TableScript(ScriptLine) VALUES(@ReferencesAction)       
  INSERT INTO @TableScript(ScriptLine) VALUES(N'GO')     END      
 --返回表的创建脚本    
 SELECT ScriptLine FROM @TableScript     SET NOCOUNT OFF
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: