首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2012-11-17 
SqlServer根据表名生成建表语句的存储过程CREATE PROCEDURE [dbo].[usp_CreateTable_DDL](? ? ? ? @sTable

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 "表名称"

热点排行
Bad Request.