SqlServer根据表名生成建表语句的存储过程

CREATE PROCEDURE [dbo].[usp_CreateTable_DDL]

(

        @sTable_Name        SYSNAME,

        @Create_Table_Ind    BIT = 1,

        @PK_Ind                BIT = 1,

        @FK_Ind                BIT = 1,

        @Check_Ind            BIT = 1,

        @Default_Ind        BIT = 1

 )

AS

BEGIN

    SET NOCOUNT ON


    DECLARE @Schema_Name        SYSNAME,

            @UniqueConstraints    BIT = 1,

            @sStr                VARCHAR(MAX)


    SELECT    @Schema_Name = SCHEMA_NAME(schema_id)

    FROM    sys.objects

    WHERE    name = @sTable_Name

    

    IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE ID = OBJECT_ID('tempdb..#PKObjectID'))    DROP TABLE #PKObjectID

    IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE ID = OBJECT_ID('tempdb..#Uniques'))        DROP TABLE #Uniques

    IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE ID = OBJECT_ID('tempdb..#Constraints'))    DROP TABLE #Constraints

    IF EXISTS (SELECT 1 FROM tempdb..sysobjects WHERE ID = OBJECT_ID('tempdb..#ShowFields'))    DROP TABLE #ShowFields


    CREATE TABLE #Constraints (ID INT IDENTITY, Constraint_Type VARCHAR(100), SQL VARCHAR(8000), Constraint_Name SYSNAME DEFAULT '')


    -- Create table

    IF @Create_Table_Ind = 1

    BEGIN

        SELECT  FieldID               = IDENTITY(INT,1,1),

                DatabaseName            = DB_NAME(),

                TableOwner                = TABLE_SCHEMA,

                TableName                = TABLE_NAME,

                FieldName                = COLUMN_NAME,

                ColumnPosition            = CAST(ORDINAL_POSITION AS INT),

                ColumnDefaultValue        = COLUMN_DEFAULT,

                ColumnDefaultName        = dobj.name,

                IsNullable                = CASE WHEN c.IS_NULLABLE = 'YES' THEN 1 ELSE 0 END,

                DataType                = DATA_TYPE,

                MaxLength                = CAST(CHARACTER_MAXIMUM_LENGTH AS INT),

                NumericPrecision        = CAST(NUMERIC_PRECISION AS INT),

                NumericScale            = CAST(NUMERIC_SCALE AS INT),

                DomainName                = DOMAIN_NAME,

                FieldListingName        = COLUMN_NAME + ',',

                FieldDefinition            = '',

                IdentityColumn            = CASE WHEN ic.object_id IS NULL THEN 0 ELSE 1 END,

                IdentitySeed            = CAST(ISNULL(ic.seed_value,0) AS INT),

                IdentityIncrement        = CAST(ISNULL(ic.increment_value,0) AS INT),

                IsCharColumn            = CASE WHEN DATA_TYPE NOT IN ('TEXT') AND st.collation_name IS NOT NULL THEN 1 ELSE 0 END

        INTO    #ShowFields

        FROM    INFORMATION_SCHEMA.COLUMNS            c

                JOIN sys.columns                    sc ON c.TABLE_NAME = OBJECT_NAME(sc.object_id) AND c.COLUMN_NAME = sc.Name

                LEFT JOIN sys.identity_columns        ic ON c.TABLE_NAME = OBJECT_NAME(ic.object_id) AND c.COLUMN_NAME = ic.Name

                JOIN sys.types                        st ON COALESCE(c.DOMAIN_NAME,c.DATA_TYPE) = st.name

                LEFT OUTER JOIN sys.objects            dobj ON dobj.object_id = sc.default_object_id AND dobj.type = 'D'

        WHERE    c.TABLE_NAME = @sTable_Name

        ORDER    BY c.TABLE_NAME, c.ORDINAL_POSITION

        SELECT    @sStr = 'IF EXISTS(SELECT * FROM dbo.sysobjects WHERE id = object_id('+'N'''+ '[dbo]' + '.' + QUOTENAME(@sTable_Name) + ''')'+ ' AND OBJECTPROPERTY(id, N'''+'IsUserTable'+''')'+'= 1)' + char(13) + char(10)

                        + 'DROP TABLE ' + '[dbo]' + '.' + QUOTENAME(@sTable_Name) + char(13) + char(10)

                        + 'CREATE TABLE ' + '[dbo]' + '.' + QUOTENAME(@sTable_Name) + '('

        SELECT    @sStr = @sStr + 

                CHAR(10) + CHAR(9) + QUOTENAME(FieldName) + ' ' +

                    CASE

                        WHEN DomainName IS NOT NULL THEN DomainName + CASE WHEN IsNullable = 1 THEN ' NULL ' ELSE ' NOT NULL ' END

                        ELSE UPPER(DataType) 

                                + CASE WHEN IsCharColumn = 1 OR DataType IN ('Varbinary') THEN '(' + CASE WHEN MaxLength = -1 THEN 'MAX' ELSE CAST(MaxLength AS VARCHAR(10)) END + ')' ELSE '' END 

                                + CASE WHEN IdentityColumn = 1 THEN ' IDENTITY(' + CAST(IdentitySeed AS VARCHAR(5))+ ',' + CAST(IdentityIncrement AS VARCHAR(5)) + ')' ELSE '' END 

                                + CASE WHEN IsNullable = 1 THEN ' NULL ' ELSE ' NOT NULL ' END 

                                --+ CASE WHEN ColumnDefaultName IS NOT NULL AND @IncludeConstraints = 1 THEN 'CONSTRAINT [' + ColumnDefaultName + '] DEFAULT' + UPPER(ColumnDefaultValue) ELSE '' END

                    END + 

                    CASE WHEN FieldID = (SELECT MAX(FieldID) FROM #ShowFields) THEN '' ELSE ',' END

        FROM #ShowFields

        

        SELECT    @sStr = @sStr + ')'

                

        INSERT    INTO #Constraints (Constraint_Type, SQL,Constraint_Name)

        VALUES    ('CREATE_TABLE', @sStr,QUOTENAME(@Schema_Name) + '.' + QUOTENAME(@sTable_Name))            

    END

    

    IF @PK_Ind = 1

    BEGIN

        -- Get Object ID of the PK

        SELECT    DISTINCT ObjectID = cco.object_id

        INTO    #PKObjectID

        FROM    sys.key_constraints            cco

                JOIN sys.index_columns        cc ON cco.parent_object_id = cc.object_id AND cco.unique_index_id = cc.index_id

                JOIN sys.indexes            i ON cc.object_id = i.object_id AND cc.index_id = i.index_id

        WHERE    OBJECT_NAME(parent_object_id) = @sTable_Name 

        AND        i.type = 1 

        AND        is_primary_key = 1


        -- Get Object ID of the Uniques

        SELECT    DISTINCT ObjectID = cco.object_id

        INTO    #Uniques

        FROM    sys.key_constraints            cco

                JOIN sys.index_columns        cc ON cco.parent_object_id = cc.object_id AND cco.unique_index_id = cc.index_id

                JOIN sys.indexes            i ON cc.object_id = i.object_id AND cc.index_id = i.index_id

        WHERE    OBJECT_NAME(parent_object_id) = @sTable_Name 

        AND        i.type = 2 

        AND        is_primary_key = 0 

        AND        is_unique_constraint = 1 


        INSERT    INTO #Constraints (Constraint_Type,Constraint_Name,SQL)

        SELECT    'PK_UNIQUE_CONSTRAINT',

                 Constraint_Name = cco.name,

                [PK_UNIQUE_CONSTRAINTS] = ISNULL('ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(@sTable_Name) + ' ADD CONSTRAINT ' 

                    + QUOTENAME(cco.name )

                    + CASE    type WHEN 'PK' THEN ' PRIMARY KEY ' + CASE WHEN pk.ObjectID IS NULL THEN 'NONCLUSTERED ' ELSE 'CLUSTERED ' END

                                 WHEN 'UQ' THEN ' UNIQUE ' 

                     END 

                    + CASE    WHEN u.ObjectID IS NOT NULL THEN ' NONCLUSTERED ' ELSE '' END 

                    + '(' + REVERSE(SUBSTRING(REVERSE((

                                                        SELECT    c.name + + CASE WHEN cc.is_descending_key = 1 THEN ' DESC' ELSE ' ASC' END + ','

                                                        FROM    sys.key_constraints            ccok

                                                                LEFT JOIN sys.index_columns cc ON ccok.parent_object_id = cc.object_id AND cco.unique_index_id = cc.index_id

                                                                LEFT JOIN sys.columns        c ON cc.object_id = c.object_id AND cc.column_id = c.column_id

                                                                LEFT JOIN sys.indexes        i ON cc.object_id = i.object_id AND cc.index_id = i.index_id

                                                        WHERE    i.object_id = ccok.parent_object_id 

                                                        AND        ccok.object_id = cco.object_id

                                                        FOR        XML PATH('')

                                                     )

                                                     ), 2, 8000)) + ')','')

        FROM    sys.key_constraints            cco

                INNER JOIN sys.schemas        s ON cco.schema_id = s.schema_id

                LEFT JOIN #PKObjectID        pk ON cco.object_id = pk.ObjectID

                LEFT JOIN #Uniques            u ON cco.object_id = u.objectID

        WHERE    OBJECT_NAME(cco.parent_object_id) = @sTable_Name

        AND        (type = 'PK'

        OR         type = CASE WHEN @UniqueConstraints = 1 THEN 'UQ' ELSE 'PK' END

                )

    END


    IF @FK_Ind = 1

    BEGIN

        PRINT 'Creating SQL for FK Constraints ...'

        INSERT    INTO #Constraints (Constraint_Type, Constraint_Name,SQL)

        SELECT   'FK_CONSTRAINT',

                 Constraint_Name=a.Name,

                [FK_CONSTRAINTS] = 'ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' WITH CHECK ADD CONSTRAINT ' + QUOTENAME(a.name) + ' FOREIGN KEY (' + a.ParentColumns + ') REFERENCES ' + QUOTENAME(a.ReferencedSchema) +'.' + QUOTENAME(a.ReferencedObject) + '(' + a.ReferencedColumns + ')'

        FROM

            (

                SELECT    fk.OBJECT_ID as object_id,

                        ReferencedSchema    = SCHEMA_NAME(o.Schema_ID),

                        ReferencedObject    = OBJECT_NAME(fk.referenced_object_id), 

                        ParentObject        = OBJECT_NAME(fk.parent_object_id),

                        Name                = fk.name,

                        ParentColumns        = REVERSE(SUBSTRING(REVERSE((

                                                    SELECT    cp.name + ','

                                                    FROM    sys.foreign_key_columns fkc

                                                            JOIN sys.columns        cp    ON fkc.parent_object_id = cp.object_id AND fkc.parent_column_id = cp.column_id

                                                    WHERE    fkc.constraint_object_id = fk.object_id

                                                    FOR        XML PATH('')

                                                 )

                                                 ), 2, 8000)),

                        ReferencedColumns    = REVERSE(SUBSTRING(REVERSE((

                                                    SELECT    cr.name + ','

                                                    FROM    sys.foreign_key_columns fkc

                                                            JOIN sys.columns cr ON fkc.referenced_object_id = cr.object_id AND fkc.referenced_column_id = cr.column_id

                                                    WHERE    fkc.constraint_object_id = fk.object_id

                                                    FOR        XML PATH('')

                                                 )

                                                 ), 2, 8000)) 

                FROM    sys.foreign_keys fk

                        INNER JOIN sys.objects o ON fk.referenced_object_id = o.object_id

            ) a

            INNER JOIN sys.objects    co ON a.object_id = co.object_id            

            INNER JOIN sys.objects    o ON co.parent_object_id = o.object_id

            INNER JOIN sys.schemas    s ON o.schema_id = s.schema_id

        WHERE a.ParentObject = @sTable_Name

        ORDER BY a.name

    END


    IF @Check_Ind = 1

    BEGIN

        -- Create check constraints for all the columns of a table

        INSERT    INTO #Constraints (Constraint_Type,SQL)

        SELECT    'CHECK_CONSTRAINT',

                [CHECK_CONSTRAINTS] = 'ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' WITH CHECK ADD CHECK ' + cc.definition + ';'

        FROM    sys.check_constraints cc

                INNER JOIN sys.objects co ON cc.object_id = co.object_id

                INNER JOIN sys.objects o ON co.parent_object_id = o.object_id

                INNER JOIN sys.schemas s ON o.schema_id = s.schema_id

        WHERE    OBJECT_NAME(cc.parent_object_id) = @sTable_Name

        ORDER    BY o.name

    END


    IF @Default_Ind = 1

    BEGIN        

        -- Create defaults for all the columns of a table

        INSERT    INTO #Constraints (Constraint_Type,SQL)

        SELECT    'DEFAULT_CONSTRAINT',

                [DEFAULT_CONSTRAINTS] = 'ALTER TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(o.name) + ' ADD DEFAULT ' + sc.text + ' FOR ' + c.name

        FROM    syscomments    sc

                INNER JOIN syscolumns c ON sc.id = c.cdefault

                INNER JOIN sys.objects o ON c.id = o.object_id

                INNER JOIN sys.schemas s ON o.schema_id = s.schema_id

        WHERE    sc.id    IN    (

                                SELECT  cdefault 

                                FROM    syscolumns

                                WHERE   id = OBJECT_ID(@Schema_Name + '.' + @sTable_Name) 

                                AND     cdefault > 0

                            )

        ORDER    BY c.name

    END

    

    SELECT    * 

    FROM    #Constraints

    WHERE    (1 = 1

    OR         Constraint_Type = CASE WHEN @Default_Ind = 1   THEN 'DEFAULT_CONSTRAINT'    ELSE '' END

    OR         Constraint_Type = CASE WHEN @Check_Ind = 1     THEN 'CHECK_CONSTRAINT'    ELSE '' END

    OR         Constraint_Type = CASE WHEN @PK_Ind = 1        THEN 'PK_UNIQUE_CONSTRAINT'   ELSE '' END

    OR         Constraint_Type = CASE WHEN @FK_Ind = 1        THEN 'FK_CONSTRAINT'          ELSE '' END

            )

    ORDER    BY ID

END

 

GO


--EXEC usp_CreateTable_DDL "表名称"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值