在SQL Server中,如何为给定的表生成CREATE TABLE语句?

我已经花了很多时间来解决这个问题,所以本文的精神,我把它张贴在这里,因为我认为这可能对别人有用。

如果任何人有更好的脚本,或添加任何东西,请张贴它。

编辑:是的,我知道如何在pipe理工作室做到这一点 – 但我需要能够从另一个应用程序中做到这一点。

我已经修改了上面的版本来运行所有表,并支持新的SQL 2005数据types。 它还保留了主键名称。 仅适用于SQL 2005(使用交叉应用)。

select 'create table [' + so.name + '] (' + o.list + ')' + CASE WHEN tc.Constraint_Name IS NULL THEN '' ELSE 'ALTER TABLE ' + so.Name + ' ADD CONSTRAINT ' + tc.Constraint_Name + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + ')' END from sysobjects so cross apply (SELECT ' ['+column_name+'] ' + data_type + case data_type when 'sql_variant' then '' when 'text' then '' when 'ntext' then '' when 'xml' then '' when 'decimal' then '(' + cast(numeric_precision as varchar) + ', ' + cast(numeric_scale as varchar) + ')' else coalesce('('+case when character_maximum_length = -1 then 'MAX' else cast(character_maximum_length as varchar) end +')','') end + ' ' + case when exists ( select id from syscolumns where object_name(id)=so.name and name=column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(so.name) as varchar) + ',' + cast(ident_incr(so.name) as varchar) + ')' else '' end + ' ' + (case when IS_NULLABLE = 'No' then 'NOT ' else '' end ) + 'NULL ' + case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT ELSE '' END + ', ' from information_schema.columns where table_name = so.name order by ordinal_position FOR XML PATH('')) o (list) left join information_schema.table_constraints tc on tc.Table_name = so.Name AND tc.Constraint_Type = 'PRIMARY KEY' cross apply (select '[' + Column_Name + '], ' FROM information_schema.key_column_usage kcu WHERE kcu.Constraint_Name = tc.Constraint_Name ORDER BY ORDINAL_POSITION FOR XML PATH('')) j (list) where xtype = 'U' AND name NOT IN ('dtproperties') 

更新:添加了对XML数据types的处理

更新2:固定的情况下,1)有多个同名的表,但具有不同的模式的表,2)有多个具有PK约束的表具有相同的名称

这是我提出的脚本。 它处理标识列,默认值和主键。 它不处理外键,索引,触发器或任何其他聪明的东西。 它适用于SQL Server 2000,2005和2008。

 declare @table varchar(100) set @table = 'MyTable' -- set table name here declare @sql table(s varchar(1000), id int identity) -- create statement insert into @sql(s) values ('create table [' + @table + '] (') -- column list insert into @sql(s) select ' ['+column_name+'] ' + data_type + coalesce('('+cast(character_maximum_length as varchar)+')','') + ' ' + case when exists ( select id from syscolumns where object_name(id)=@table and name=column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(@table) as varchar) + ',' + cast(ident_incr(@table) as varchar) + ')' else '' end + ' ' + ( case when IS_NULLABLE = 'No' then 'NOT ' else '' end ) + 'NULL ' + coalesce('DEFAULT '+COLUMN_DEFAULT,'') + ',' from INFORMATION_SCHEMA.COLUMNS where table_name = @table order by ordinal_position -- primary key declare @pkname varchar(100) select @pkname = constraint_name from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where table_name = @table and constraint_type='PRIMARY KEY' if ( @pkname is not null ) begin insert into @sql(s) values(' PRIMARY KEY (') insert into @sql(s) select ' ['+COLUMN_NAME+'],' from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where constraint_name = @pkname order by ordinal_position -- remove trailing comma update @sql set s=left(s,len(s)-1) where id=@@identity insert into @sql(s) values (' )') end else begin -- remove trailing comma update @sql set s=left(s,len(s)-1) where id=@@identity end -- closing bracket insert into @sql(s) values( ')' ) -- result! select s from @sql order by id 

有一个PowerShell脚本埋在msdb论坛,将脚本的所有表和相关的对象:

 # Script all tables in a database [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null $s = new-object ('Microsoft.SqlServer.Management.Smo.Server') '<Servername>' $db = $s.Databases['<Database>'] $scrp = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($s) $scrp.Options.AppendToFile = $True $scrp.Options.ClusteredIndexes = $True $scrp.Options.DriAll = $True $scrp.Options.ScriptDrops = $False $scrp.Options.IncludeHeaders = $False $scrp.Options.ToFileOnly = $True $scrp.Options.Indexes = $True $scrp.Options.WithDependencies = $True $scrp.Options.FileName = 'C:\Temp\<Database>.SQL' foreach($item in $db.Tables) { $tablearray+=@($item) } $scrp.Script($tablearray) Write-Host "Scripting complete" 

支持模式:

这是一个更新版本,修改了大卫等人的伟大答案。 增加了对命名模式的支持。 应该指出的是,如果在各种模式中存在实际上具有相同名称的表,则这可能会中断。 另一个改进是使用官方的QuoteName()函数。

 SELECT t.TABLE_CATALOG, t.TABLE_SCHEMA, t.TABLE_NAME, 'create table '+QuoteName(t.TABLE_SCHEMA)+'.' + QuoteName(so.name) + ' (' + LEFT(o.List, Len(o.List)-1) + '); ' + CASE WHEN tc.Constraint_Name IS NULL THEN '' ELSE 'ALTER TABLE ' + QuoteName(t.TABLE_SCHEMA)+'.' + QuoteName(so.name) + ' ADD CONSTRAINT ' + tc.Constraint_Name + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + '); ' END as 'SQL_CREATE_TABLE' FROM sysobjects so CROSS APPLY ( SELECT ' ['+column_name+'] ' + data_type + case data_type when 'sql_variant' then '' when 'text' then '' when 'ntext' then '' when 'decimal' then '(' + cast(numeric_precision as varchar) + ', ' + cast(numeric_scale as varchar) + ')' else coalesce( '('+ case when character_maximum_length = -1 then 'MAX' else cast(character_maximum_length as varchar) end + ')','') end + ' ' + case when exists ( SELECT id FROM syscolumns WHERE object_name(id) = so.name and name = column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(so.name) as varchar) + ',' + cast(ident_incr(so.name) as varchar) + ')' else '' end + ' ' + (case when IS_NULLABLE = 'No' then 'NOT ' else '' end) + 'NULL ' + case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT ELSE '' END + ',' -- can't have a field name or we'll end up with XML FROM information_schema.columns WHERE table_name = so.name ORDER BY ordinal_position FOR XML PATH('') ) o (list) LEFT JOIN information_schema.table_constraints tc on tc.Table_name = so.Name AND tc.Constraint_Type = 'PRIMARY KEY' LEFT JOIN information_schema.tables t on t.Table_name = so.Name CROSS APPLY ( SELECT QuoteName(Column_Name) + ', ' FROM information_schema.key_column_usage kcu WHERE kcu.Constraint_Name = tc.Constraint_Name ORDER BY ORDINAL_POSITION FOR XML PATH('') ) j (list) WHERE xtype = 'U' AND name NOT IN ('dtproperties') -- AND so.name = 'ASPStateTempSessions' ; 

..

在Management Studio中使用:

上面的sql代码的一个贬低者是如果你使用SSMS进行testing,long语句不容易阅读。 所以,根据这个有用的文章 ,这是另一个版本,有点修改后点击网格单元格的链接后,眼睛更容易。 结果更容易被识别为db中每个表格的格式良好的CREATE TABLE语句。

 -- settings DECLARE @CRLF NCHAR(2) SET @CRLF = Nchar(13) + NChar(10) DECLARE @PLACEHOLDER NCHAR(3) SET @PLACEHOLDER = '{:}' -- the main query SELECT t.TABLE_CATALOG, t.TABLE_SCHEMA, t.TABLE_NAME, CAST( REPLACE( 'create table ' + QuoteName(t.TABLE_SCHEMA) + '.' + QuoteName(so.name) + ' (' + @CRLF + LEFT(o.List, Len(o.List) - (LEN(@PLACEHOLDER)+2)) + @CRLF + ');' + @CRLF + CASE WHEN tc.Constraint_Name IS NULL THEN '' ELSE 'ALTER TABLE ' + QuoteName(t.TABLE_SCHEMA) + '.' + QuoteName(so.Name) + ' ADD CONSTRAINT ' + tc.Constraint_Name + ' PRIMARY KEY (' + LEFT(j.List, Len(j.List) - 1) + ');' + @CRLF END, @PLACEHOLDER, @CRLF ) AS XML) as 'SQL_CREATE_TABLE' FROM sysobjects so CROSS APPLY ( SELECT ' ' + '['+column_name+'] ' + data_type + case data_type when 'sql_variant' then '' when 'text' then '' when 'ntext' then '' when 'decimal' then '(' + cast(numeric_precision as varchar) + ', ' + cast(numeric_scale as varchar) + ')' else coalesce( '('+ case when character_maximum_length = -1 then 'MAX' else cast(character_maximum_length as varchar) end + ')','') end + ' ' + case when exists ( SELECT id FROM syscolumns WHERE object_name(id) = so.name and name = column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(so.name) as varchar) + ',' + cast(ident_incr(so.name) as varchar) + ')' else '' end + ' ' + (case when IS_NULLABLE = 'No' then 'NOT ' else '' end) + 'NULL ' + case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT ELSE '' END + ', ' + @PLACEHOLDER -- note, can't have a field name or we'll end up with XML FROM information_schema.columns where table_name = so.name ORDER BY ordinal_position FOR XML PATH('') ) o (list) LEFT JOIN information_schema.table_constraints tc on tc.Table_name = so.Name AND tc.Constraint_Type = 'PRIMARY KEY' LEFT JOIN information_schema.tables t on t.Table_name = so.Name CROSS APPLY ( SELECT QUOTENAME(Column_Name) + ', ' FROM information_schema.key_column_usage kcu WHERE kcu.Constraint_Name = tc.Constraint_Name ORDER BY ORDINAL_POSITION FOR XML PATH('') ) j (list) WHERE xtype = 'U' AND name NOT IN ('dtproperties') -- AND so.name = 'ASPStateTempSessions' ; 

不是要说明这一点,但是下面是用于比较的function上等效的示例输出:

 -- 1 (scripting version) create table [dbo].[ASPStateTempApplications] ( [AppId] int NOT NULL , [AppName] char(280) NOT NULL ); ALTER TABLE [dbo].[ASPStateTempApplications] ADD CONSTRAINT PK__ASPState__8E2CF7F908EA5793 PRIMARY KEY ([AppId]); -- 2 (SSMS version) create table [dbo].[ASPStateTempSessions] ( [SessionId] nvarchar(88) NOT NULL , [Created] datetime NOT NULL DEFAULT (getutcdate()), [Expires] datetime NOT NULL , [LockDate] datetime NOT NULL , [LockDateLocal] datetime NOT NULL , [LockCookie] int NOT NULL , [Timeout] int NOT NULL , [Locked] bit NOT NULL , [SessionItemShort] varbinary(7000) NULL , [SessionItemLong] image(2147483647) NULL , [Flags] int NOT NULL DEFAULT ((0)) ); ALTER TABLE [dbo].[ASPStateTempSessions] ADD CONSTRAINT PK__ASPState__C9F4929003317E3D PRIMARY KEY ([SessionId]); 

..

剥离因素:

应该指出的是,由于缺less对主键以外的其他参数的支持,我对此仍然相对不高兴。 它仍然适合用作简单数据导出或复制的机制。

如果您正在生成脚本的应用程序是.NET应用程序,则可能需要使用SMO(Sqlpipe理对象)进行研究。 参考此SQL Team链接了解如何使用SMO来编写脚本对象。

我修改了接受的答案,现在它可以获得包括主键和外键在内的命令。

 declare @table varchar(100) declare @schema varchar(100) set @table = 'Persons' -- set table name here set @schema = 'OT' -- set SCHEMA name here declare @sql table(s varchar(1000), id int identity) -- create statement insert into @sql(s) values ('create table ' + @table + ' (') -- column list insert into @sql(s) select ' '+column_name+' ' + data_type + coalesce('('+cast(character_maximum_length as varchar)+')','') + ' ' + case when exists ( select id from syscolumns where object_name(id)=@table and name=column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(@table) as varchar) + ',' + cast(ident_incr(@table) as varchar) + ')' else '' end + ' ' + ( case when IS_NULLABLE = 'No' then 'NOT ' else '' end ) + 'NULL ' + coalesce('DEFAULT '+COLUMN_DEFAULT,'') + ',' from information_schema.columns where table_name = @table and table_schema = @schema order by ordinal_position -- primary key declare @pkname varchar(100) select @pkname = constraint_name from information_schema.table_constraints where table_name = @table and constraint_type='PRIMARY KEY' if ( @pkname is not null ) begin insert into @sql(s) values(' PRIMARY KEY (') insert into @sql(s) select ' '+COLUMN_NAME+',' from information_schema.key_column_usage where constraint_name = @pkname order by ordinal_position -- remove trailing comma update @sql set s=left(s,len(s)-1) where id=@@identity insert into @sql(s) values (' )') end else begin -- remove trailing comma update @sql set s=left(s,len(s)-1) where id=@@identity end -- foreign key declare @fkname varchar(100) select @fkname = constraint_name from information_schema.table_constraints where table_name = @table and constraint_type='FOREIGN KEY' if ( @fkname is not null ) begin insert into @sql(s) values(',') insert into @sql(s) values(' FOREIGN KEY (') insert into @sql(s) select ' '+COLUMN_NAME+',' from information_schema.key_column_usage where constraint_name = @fkname order by ordinal_position -- remove trailing comma update @sql set s=left(s,len(s)-1) where id=@@identity insert into @sql(s) values (' ) REFERENCES ') insert into @sql(s) SELECT OBJECT_NAME(fk.referenced_object_id) FROM sys.foreign_keys fk INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id INNER JOIN sys.columns c1 ON fkc.parent_column_id = c1.column_id AND fkc.parent_object_id = c1.object_id INNER JOIN sys.columns c2 ON fkc.referenced_column_id = c2.column_id AND fkc.referenced_object_id = c2.object_id where fk.name = @fkname insert into @sql(s) SELECT '('+c2.name+')' FROM sys.foreign_keys fk INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id INNER JOIN sys.columns c1 ON fkc.parent_column_id = c1.column_id AND fkc.parent_object_id = c1.object_id INNER JOIN sys.columns c2 ON fkc.referenced_column_id = c2.column_id AND fkc.referenced_object_id = c2.object_id where fk.name = @fkname end -- closing bracket insert into @sql(s) values( ')' ) -- result! select s from @sql order by id 

另外一个支持外键的变体,在一个语句中:

  SELECT obj.name ,'CREATE TABLE [' + obj.name + '] (' + LEFT(cols.list, LEN(cols.list) - 1 ) + ')' + ISNULL(' ' + refs.list, '') FROM sysobjects obj CROSS APPLY ( SELECT CHAR(10) + ' [' + column_name + '] ' + data_type + CASE data_type WHEN 'sql_variant' THEN '' WHEN 'text' THEN '' WHEN 'ntext' THEN '' WHEN 'xml' THEN '' WHEN 'decimal' THEN '(' + CAST(numeric_precision as VARCHAR) + ', ' + CAST(numeric_scale as VARCHAR) + ')' ELSE COALESCE('(' + CASE WHEN character_maximum_length = -1 THEN 'MAX' ELSE CAST(character_maximum_length as VARCHAR) END + ')', '') END + ' ' + case when exists ( -- Identity skip select id from syscolumns where object_name(id) = obj.name and name = column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(obj.name) as varchar) + ',' + cast(ident_incr(obj.name) as varchar) + ')' else '' end + ' ' + CASE WHEN IS_NULLABLE = 'No' THEN 'NOT ' ELSE '' END + 'NULL' + CASE WHEN information_schema.columns.column_default IS NOT NULL THEN ' DEFAULT ' + information_schema.columns.column_default ELSE '' END + ',' FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = obj.name ORDER BY ordinal_position FOR XML PATH('') ) cols (list) CROSS APPLY( SELECT CHAR(10) + 'ALTER TABLE ' + obj.name + '_noident_temp ADD ' + LEFT(alt, LEN(alt)-1) FROM( SELECT CHAR(10) + ' CONSTRAINT ' + tc.constraint_name + ' ' + tc.constraint_type + ' (' + LEFT(c.list, LEN(c.list)-1) + ')' + COALESCE(CHAR(10) + r.list, ', ') FROM information_schema.table_constraints tc CROSS APPLY( SELECT '[' + kcu.column_name + '], ' FROM information_schema.key_column_usage kcu WHERE kcu.constraint_name = tc.constraint_name ORDER BY kcu.ordinal_position FOR XML PATH('') ) c (list) OUTER APPLY( -- // http://stackoverflow.com/questions/3907879/sql-server-howto-get-foreign-key-reference-from-information-schema SELECT ' REFERENCES [' + kcu1.constraint_schema + '].' + '[' + kcu2.table_name + ']' + '(' + kcu2.column_name + '), ' FROM information_schema.referential_constraints as rc JOIN information_schema.key_column_usage as kcu1 ON (kcu1.constraint_catalog = rc.constraint_catalog AND kcu1.constraint_schema = rc.constraint_schema AND kcu1.constraint_name = rc.constraint_name) JOIN information_schema.key_column_usage as kcu2 ON (kcu2.constraint_catalog = rc.unique_constraint_catalog AND kcu2.constraint_schema = rc.unique_constraint_schema AND kcu2.constraint_name = rc.unique_constraint_name AND kcu2.ordinal_position = KCU1.ordinal_position) WHERE kcu1.constraint_catalog = tc.constraint_catalog AND kcu1.constraint_schema = tc.constraint_schema AND kcu1.constraint_name = tc.constraint_name ) r (list) WHERE tc.table_name = obj.name FOR XML PATH('') ) a (alt) ) refs (list) WHERE xtype = 'U' AND name NOT IN ('dtproperties') AND obj.name = 'your_table_name' 

你可以尝试在sqlfiddle: http ://sqlfiddle.com/#!6/e3b66/3/0

我将通过支持分区表来改进答案:

使用下面的scritps查找分区scheme和分区键:

 declare @partition_scheme varchar(100) = ( select distinct ps.Name AS PartitionScheme from sys.indexes i join sys.partitions p ON i.object_id=p.object_id AND i.index_id=p.index_id join sys.partition_schemes ps on ps.data_space_id = i.data_space_id where i.object_id = object_id('your table name') ) print @partition_scheme declare @partition_column varchar(100) = ( select c.name from sys.tables t join sys.indexes i on(i.object_id = t.object_id and i.index_id < 2) join sys.index_columns ic on(ic.partition_ordinal > 0 and ic.index_id = i.index_id and ic.object_id = t.object_id) join sys.columns c on(c.object_id = ic.object_id and c.column_id = ic.column_id) where t.object_id = object_id('your table name') ) print @partition_column 

然后通过在正确的位置添加下面一行来更改生成查询:

 + IIF(@partition_scheme is null, '', 'ON [' + @partition_scheme + ']([' + @partition_column + '])') 

由于@Blorgbeard分享他的脚本信用。 我一定会collections它,以防万一我需要它。

是的,您可以在表上“右键单击”并编写CREATE TABLE脚本,但是:

  • 一个脚本将包含cruft的负载 (对扩展属性感兴趣的任何人?)
  • 如果您的模式中有200多个表格,则需要半天的时间手动编写该表格。

有了这个脚本转换成存储过程,并结合包装脚本,你会有一个很好的自动化的方式转储您的表devise到源代码pipe理等

其余的DB代码(SP的,FK索引,触发器等)将在源代码控制之下;)

我注意到了一些东西 – 在INFORMATION_SCHEMA.COLUMNS视图中,CHARACTER_MAXIMUM_LENGTH为字段types(如图像和文本)提供了大小2147483647(2 ^ 31-1)。 ntext是2 ^ 30-1(是双字节unicode和全部)。

这个大小包含在这个查询的输出中,但是在CREATE语句中这些数据types是无效的(它们不应该有最大大小值)。 因此,除非手动更正了这个结果,否则CREATE脚本将无法使用这些数据types。

我想可以修复脚本来解决这个问题,但这超出了我的SQLfunction。

– 或者你可以创build一个存储过程…首先创buildId

 USE [db] GO /****** Object: StoredProcedure [dbo].[procUtils_InsertGeneratorWithId] Script Date: 06/13/2009 22:18:11 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create PROC [dbo].[procUtils_InsertGeneratorWithId] ( @domain_user varchar(50), @tableName varchar(100) ) as --Declare a cursor to retrieve column specific information for the specified table DECLARE cursCol CURSOR FAST_FORWARD FOR SELECT column_name,data_type FROM information_schema.columns WHERE table_name = @tableName OPEN cursCol DECLARE @string nvarchar(3000) --for storing the first half of INSERT statement DECLARE @stringData nvarchar(3000) --for storing the data (VALUES) related statement DECLARE @dataType nvarchar(1000) --data types returned for respective columns DECLARE @IDENTITY_STRING nvarchar ( 100 ) SET @IDENTITY_STRING = ' ' select @IDENTITY_STRING SET @string='INSERT '+@tableName+'(' SET @stringData='' DECLARE @colName nvarchar(50) FETCH NEXT FROM cursCol INTO @colName,@dataType IF @@fetch_status<>0 begin print 'Table '+@tableName+' not found, processing skipped.' close curscol deallocate curscol return END WHILE @@FETCH_STATUS=0 BEGIN IF @dataType in ('varchar','char','nchar','nvarchar') BEGIN --SET @stringData=@stringData+'''''''''+isnull('+@colName+','''')+'''''',''+' SET @stringData=@stringData+''''+'''+isnull('''''+'''''+'+@colName+'+'''''+''''',''NULL'')+'',''+' END ELSE if @dataType in ('text','ntext') --if the datatype is text or something else BEGIN SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(2000)),'''')+'''''',''+' END ELSE IF @dataType = 'money' --because money doesn't get converted from varchar implicitly BEGIN SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+' END ELSE IF @dataType='datetime' BEGIN --SET @stringData=@stringData+'''convert(datetime,''''''+isnull(cast('+@colName+' as varchar(200)),''0'')+''''''),''+' --SELECT 'INSERT Authorizations(StatusDate) VALUES('+'convert(datetime,'+isnull(''''+convert(varchar(200),StatusDate,121)+'''','NULL')+',121),)' FROM Authorizations --SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+' SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+' -- 'convert(datetime,'+isnull(''''+convert(varchar(200),StatusDate,121)+'''','NULL')+',121),)' FROM Authorizations END ELSE IF @dataType='image' BEGIN SET @stringData=@stringData+'''''''''+isnull(cast(convert(varbinary,'+@colName+') as varchar(6)),''0'')+'''''',''+' END ELSE --presuming the data type is int,bit,numeric,decimal BEGIN --SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(200)),''0'')+'''''',''+' --SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+' SET @stringData=@stringData+''''+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+')+'''''+''''',''NULL'')+'',''+' END SET @string=@string+@colName+',' FETCH NEXT FROM cursCol INTO @colName,@dataType END DECLARE @Query nvarchar(4000) SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' FROM '+@tableName exec sp_executesql @query --select @query CLOSE cursCol DEALLOCATE cursCol /* USAGE */ GO 

– 第二个没有iD INSERTION

 USE [db] GO /****** Object: StoredProcedure [dbo].[procUtils_InsertGenerator] Script Date: 06/13/2009 22:20:52 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROC [dbo].[procUtils_InsertGenerator] ( @domain_user varchar(50), @tableName varchar(100) ) as --Declare a cursor to retrieve column specific information for the specified table DECLARE cursCol CURSOR FAST_FORWARD FOR -- SELECT column_name,data_type FROM information_schema.columns WHERE table_name = @tableName /* NEW SELECT c.name , sc.data_type FROM sys.extended_properties AS ep INNER JOIN sys.tables AS t ON ep.major_id = t.object_id INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id INNER JOIN INFORMATION_SCHEMA.COLUMNS sc ON t.name = sc.table_name and c.name = sc.column_name WHERE t.name = @tableName and c.is_identity=0 */ select object_name(c.object_id) "TABLE_NAME", c.name "COLUMN_NAME", s.name "DATA_TYPE" from sys.columns c join sys.systypes s on (s.xtype = c.system_type_id) where object_name(c.object_id) in (select name from sys.tables where name not like 'sysdiagrams') AND object_name(c.object_id) in (select name from sys.tables where [name]=@tableName ) and c.is_identity=0 and s.name not like 'sysname' OPEN cursCol DECLARE @string nvarchar(3000) --for storing the first half of INSERT statement DECLARE @stringData nvarchar(3000) --for storing the data (VALUES) related statement DECLARE @dataType nvarchar(1000) --data types returned for respective columns DECLARE @IDENTITY_STRING nvarchar ( 100 ) SET @IDENTITY_STRING = ' ' select @IDENTITY_STRING SET @string='INSERT '+@tableName+'(' SET @stringData='' DECLARE @colName nvarchar(50) FETCH NEXT FROM cursCol INTO @tableName , @colName,@dataType IF @@fetch_status<>0 begin print 'Table '+@tableName+' not found, processing skipped.' close curscol deallocate curscol return END WHILE @@FETCH_STATUS=0 BEGIN IF @dataType in ('varchar','char','nchar','nvarchar') BEGIN --SET @stringData=@stringData+'''''''''+isnull('+@colName+','''')+'''''',''+' SET @stringData=@stringData+''''+'''+isnull('''''+'''''+'+@colName+'+'''''+''''',''NULL'')+'',''+' END ELSE if @dataType in ('text','ntext') --if the datatype is text or something else BEGIN SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(2000)),'''')+'''''',''+' END ELSE IF @dataType = 'money' --because money doesn't get converted from varchar implicitly BEGIN SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+' END ELSE IF @dataType='datetime' BEGIN --SET @stringData=@stringData+'''convert(datetime,''''''+isnull(cast('+@colName+' as varchar(200)),''0'')+''''''),''+' --SELECT 'INSERT Authorizations(StatusDate) VALUES('+'convert(datetime,'+isnull(''''+convert(varchar(200),StatusDate,121)+'''','NULL')+',121),)' FROM Authorizations --SET @stringData=@stringData+'''convert(money,''''''+isnull(cast('+@colName+' as varchar(200)),''0.0000'')+''''''),''+' SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+' -- 'convert(datetime,'+isnull(''''+convert(varchar(200),StatusDate,121)+'''','NULL')+',121),)' FROM Authorizations END ELSE IF @dataType='image' BEGIN SET @stringData=@stringData+'''''''''+isnull(cast(convert(varbinary,'+@colName+') as varchar(6)),''0'')+'''''',''+' END ELSE --presuming the data type is int,bit,numeric,decimal BEGIN --SET @stringData=@stringData+'''''''''+isnull(cast('+@colName+' as varchar(200)),''0'')+'''''',''+' --SET @stringData=@stringData+'''convert(datetime,'+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+',121)+'''''+''''',''NULL'')+'',121),''+' SET @stringData=@stringData+''''+'''+isnull('''''+'''''+convert(varchar(200),'+@colName+')+'''''+''''',''NULL'')+'',''+' END SET @string=@string+@colName+',' FETCH NEXT FROM cursCol INTO @tableName , @colName,@dataType END DECLARE @Query nvarchar(4000) SET @query ='SELECT '''+substring(@string,0,len(@string)) + ') VALUES(''+ ' + substring(@stringData,0,len(@stringData)-2)+'''+'')'' FROM '+@tableName exec sp_executesql @query --select @query CLOSE cursCol DEALLOCATE cursCol /* use poc go DECLARE @RC int DECLARE @domain_user varchar(50) DECLARE @tableName varchar(100) -- TODO: Set parameter values here. set @domain_user='yorgeorg' set @tableName = 'tbGui_WizardTabButtonAreas' EXECUTE @RC = [POC].[dbo].[procUtils_InsertGenerator] @domain_user ,@tableName */ GO 

在经典的ASP中显示创build表 (处理约束,主键,复制表结构和/或数据…)

Sql服务器从Microsoft sql server显示创build表Mysql样式的“显示创build表”和“显示创build数据库”命令。 脚本写的是微软的ASP语言,很容易移植到另一种语言。*

我包括计算列的定义

  select 'CREATE TABLE [' + so.name + '] (' + o.list + ')' + CASE WHEN tc.Constraint_Name IS NULL THEN '' ELSE 'ALTER TABLE ' + so.Name + ' ADD CONSTRAINT ' + tc.Constraint_Name + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + ')' END, name from sysobjects so cross apply (SELECT case when comps.definition is not null then ' ['+column_name+'] AS ' + comps.definition else ' ['+column_name+'] ' + data_type + case when data_type like '%text' or data_type in ('image', 'sql_variant' ,'xml') then '' when data_type in ('float') then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ')' when data_type in ('datetime2', 'datetimeoffset', 'time') then '(' + cast(coalesce(datetime_precision, 7) as varchar(11)) + ')' when data_type in ('decimal', 'numeric') then '(' + cast(coalesce(numeric_precision, 18) as varchar(11)) + ',' + cast(coalesce(numeric_scale, 0) as varchar(11)) + ')' when (data_type like '%binary' or data_type like '%char') and character_maximum_length = -1 then '(max)' when character_maximum_length is not null then '(' + cast(character_maximum_length as varchar(11)) + ')' else '' end + ' ' + case when exists ( select id from syscolumns where object_name(id)=so.name and name=column_name and columnproperty(id,name,'IsIdentity') = 1 ) then 'IDENTITY(' + cast(ident_seed(so.name) as varchar) + ',' + cast(ident_incr(so.name) as varchar) + ')' else '' end + ' ' + (case when information_schema.columns.IS_NULLABLE = 'No' then 'NOT ' else '' end ) + 'NULL ' + case when information_schema.columns.COLUMN_DEFAULT IS NOT NULL THEN 'DEFAULT '+ information_schema.columns.COLUMN_DEFAULT ELSE '' END end + ', ' from information_schema.columns left join sys.computed_columns comps on OBJECT_ID(information_schema.columns.TABLE_NAME)=comps.object_id and information_schema.columns.COLUMN_NAME=comps.name where table_name = so.name order by ordinal_position FOR XML PATH('')) o (list) left join information_schema.table_constraints tc on tc.Table_name = so.Name AND tc.Constraint_Type = 'PRIMARY KEY' cross apply (select '[' + Column_Name + '], ' FROM information_schema.key_column_usage kcu WHERE kcu.Constraint_Name = tc.Constraint_Name ORDER BY ORDINAL_POSITION FOR XML PATH('')) j (list) where xtype = 'U' AND name NOT IN ('dtproperties') 

我意识到,这是一个很长的时间,但我想我会补充。 如果你只是想要表,而不是你可以使用的create table语句

 select into x from db.schema.y where 1=0 

将表复制到新的数据库

如果您正在使用management studio并打开查询分析器窗口,则可以将表名称拖动到查询分析器窗口并… bingo! 你得到表格脚本。 我没有在SQL2008中试过这个