SQL SERVER 生成表结构的语句

来源:互联网 发布:拍婚纱照攻略知乎 编辑:程序博客网 时间:2024/05/22 03:25
--获取表结构创建脚本 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

0 0