如何使用SQL查询在SQL SERVER 2008 R2中获取表定义?

我创建了一个示例java程序,在其中我使用以下查询获取所有对象的定义,如视图,触发器,函数等: –

select object_definition(object_id) from sys.objects where type='V'; //for Views select object_definition(object_id) from sys.objects where type='TF'; //for Functions select object_definition(object_id) from sys.objects where type='TR'; //for Triggers select object_definition(object_id) from sys.objects where type='P'; //for Stored Procedures 

但是以下查询无法获取表的ddl(表定义): –

 select object_definition(object_id) from sys.objects where type='U'; //for User defined Tables 

现在我使用这里给出的解决方案: 使用Query为现有表生成SQL创建脚本以及如何 为现有表 生成CREATE TABLE脚本:第1部分

是否有任何直接的SQL查询使用我可以得到表定义。

看看吧

 SELECT * FROM INFORMATION_SCHEMA.TABLES 

 SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

我在Tim Chapman找到了这个( http://www.techrepublic.com/blog/the-enterprise-cloud/script-table-definitions-using-tsql/ )并做了一些格式化和小修改:

电话很简单

 SELECT dbo.CreateScriptTable( 'YourTable',1,1,'NewName',0) 

尝试一下:

 CREATE FUNCTION dbo.CreateScriptTable ( @TableName SYSNAME, @IncludeConstraints BIT = 1, @IncludeIndexes BIT = 1, @NewTableName SYSNAME = NULL, @UseSystemDataTypes BIT = 0 ) RETURNS VARCHAR(MAX) AS BEGIN DECLARE @MainDefinition TABLE(FieldValue VARCHAR(200)); DECLARE @DBName SYSNAME; DECLARE @ClusteredPK BIT; DECLARE @TableSchema NVARCHAR(255); SET @DBName = DB_NAME(DB_ID()); SELECT @TableName = name FROM sysobjects WHERE id = OBJECT_ID(@TableName); DECLARE @ShowFields TABLE(FieldID INT IDENTITY(1,1),DatabaseName VARCHAR(100),TableOwner VARCHAR(100),TableName VARCHAR(100),FieldName VARCHAR(100), ColumnPosition INT,ColumnDefaultValue VARCHAR(100),ColumnDefaultName VARCHAR(100),IsNullable BIT,DataType VARCHAR(100),MaxLength INT, NumericPrecision INT,NumericScale INT,DomainName VARCHAR(100),FieldListingName VARCHAR(110),FieldDefinition CHAR(1),IdentityColumn BIT, IdentitySeed INT,IdentityIncrement INT,IsCharColumn BIT); DECLARE @HoldingArea TABLE(FldID SMALLINT IDENTITY(1,1),Flds VARCHAR(4000),FldValue CHAR(1) DEFAULT(0)); DECLARE @PKObjectID TABLE(ObjectID INT); DECLARE @Uniques TABLE(ObjectID INT); DECLARE @HoldingAreaValues TABLE(FldID SMALLINT IDENTITY(1,1),Flds VARCHAR(4000),FldValue CHAR(1) DEFAULT(0)); DECLARE @Definition TABLE(DefinitionID SMALLINT IDENTITY(1,1),FieldValue VARCHAR(200)); INSERT INTO @ShowFields(DatabaseName,TableOwner,TableName,FieldName,ColumnPosition,ColumnDefaultValue,ColumnDefaultName,IsNullable, DataType,MaxLength,NumericPrecision,NumericScale,DomainName, FieldListingName,FieldDefinition,IdentityColumn,IdentitySeed, IdentityIncrement,IsCharColumn) SELECT DB_NAME(),TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,CAST(ORDINAL_POSITION AS INT),COLUMN_DEFAULT,dobj.name AS ColumnDefaultName, CASE WHEN c.IS_NULLABLE = 'YES' THEN 1 ELSE 0 END,DATA_TYPE,CAST(CHARACTER_MAXIMUM_LENGTH AS INT),CAST(NUMERIC_PRECISION AS INT),CAST(NUMERIC_SCALE AS INT), DOMAIN_NAME,COLUMN_NAME + ',','' AS FieldDefinition,CASE WHEN ic.object_id IS NULL THEN 0 ELSE 1 END AS IdentityColumn,CAST(ISNULL(ic.seed_value,0) AS INT) AS IdentitySeed, CAST(ISNULL(ic.increment_value,0) AS INT) AS IdentityIncrement,CASE WHEN st.collation_name IS NOT NULL THEN 1 ELSE 0 END AS IsCharColumn 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 = @TableName ORDER BY c.TABLE_NAME, c.ORDINAL_POSITION; SELECT TOP 1 @TableSchema = TableOwner FROM @ShowFields; INSERT INTO @HoldingArea (Flds) VALUES('('); INSERT INTO @Definition(FieldValue) VALUES('CREATE TABLE ' + CASE WHEN @NewTableName IS NOT NULL THEN @NewTableName ELSE @DBName + '.' + @TableSchema + '.' + @TableName END); INSERT INTO @Definition(FieldValue) VALUES('('); INSERT INTO @Definition(FieldValue) SELECT FieldName + ' ' + CASE WHEN DomainName IS NOT NULL AND @UseSystemDataTypes = 0 THEN DomainName + CASE WHEN IsNullable = 1 THEN ' NULL ' ELSE ' NOT NULL ' END ELSE UPPER(DataType) + CASE WHEN IsCharColumn = 1 THEN '(' + CAST(MaxLength AS VARCHAR(10)) + ')' 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; IF @IncludeConstraints = 1 BEGIN INSERT INTO @Definition(FieldValue) SELECT ',CONSTRAINT [' + name + '] FOREIGN KEY (' + ParentColumns + ') REFERENCES [' + ReferencedObject + '](' + ReferencedColumns + ')' FROM (SELECT ReferencedObject = OBJECT_NAME(fk.referenced_object_id), ParentObject = OBJECT_NAME(parent_object_id),fk.name,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)) ParentColumns, 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)) ReferencedColumns FROM sys.foreign_keys fk) a WHERE ParentObject = @TableName; INSERT INTO @Definition(FieldValue) SELECT',CONSTRAINT [' + name + '] CHECK ' + definition FROM sys.check_constraints WHERE OBJECT_NAME(parent_object_id) = @TableName; INSERT INTO @PKObjectID(ObjectID) SELECT DISTINCT PKObject = cco.object_id 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) = @TableName AND i.type = 1 AND is_primary_key = 1; INSERT INTO @Uniques(ObjectID) SELECT DISTINCT PKObject = cco.object_id 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) = @TableName AND i.type = 2 AND is_primary_key = 0 AND is_unique_constraint = 1; SET @ClusteredPK = CASE WHEN @@ROWCOUNT > 0 THEN 1 ELSE 0 END; INSERT INTO @Definition(FieldValue) SELECT ',CONSTRAINT ' + 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 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) = @TableName END INSERT INTO @Definition(FieldValue) VALUES(');'); IF @IncludeIndexes = 1 BEGIN INSERT INTO @Definition(FieldValue) SELECT 'CREATE ' + type_desc + ' INDEX [' + [name] COLLATE SQL_Latin1_General_CP1_CI_AS + '] ON [' + OBJECT_NAME(object_id) + '] (' + REVERSE(SUBSTRING(REVERSE(( SELECT name + CASE WHEN sc.is_descending_key = 1 THEN ' DESC' ELSE ' ASC' END + ',' FROM sys.index_columns sc JOIN sys.columns c ON sc.object_id = c.object_id AND sc.column_id = c.column_id WHERE OBJECT_NAME(sc.object_id) = @TableName AND sc.object_id = i.object_id AND sc.index_id = i.index_id ORDER BY index_column_id ASC FOR XML PATH(''))), 2, 8000)) + ');' FROM sys.indexes i WHERE OBJECT_NAME(object_id) = @TableName; END RETURN ( SELECT STUFF ( (SELECT CHAR(10) + FieldValue FROM @Definition FOR XML PATH('')),1,1,'') ); END GO