生命在于积累

导航

 

-----------获取当前数据库所有表的外键创建脚本、获取指定表的创建脚本,包括表和字段的属性、外键-----------------------

 1 CREATE PROCEDURE [dbo].[sp_HelpTable](@TableName sysname)
2 AS
3 SET NOCOUNT ON
4 DECLARE @ObjectID int
5 DECLARE @TableScript table(Iden int IDENTITY(1, 1), ScriptLine nvarchar(4000))
6 SET @ObjectID = object_id(@TableName)
7 IF @ObjectID IS NULL OR OBJECTPROPERTY(@ObjectID, 'IsTable') = 0
8 BEGIN
9 RAISERROR('指定的对象不是表对象', 16, 1)
10 RETURN
11 END
12 --获取表的创建脚本
13 --插入表头
14 INSERT INTO @TableScript(ScriptLine)
15 SELECT N'CREATE TABLE [' + USER_NAME(OBJECTPROPERTY(@ObjectID, N'OwnerId')) + N'].[' + object_name(@ObjectID) + N']('
16
17 --插入字段
18 INSERT INTO @TableScript(ScriptLine)
19 SELECT N' [' + a.Name + N'] [' + b.name + N']' +
20 CASE WHEN c.Object_id IS NOT NULL THEN N' IDENTITY(' + CONVERT(nvarchar, c.seed_value) + N', ' + CONVERT(nvarchar, c.increment_value) + N')'
21 ELSE '' END +
22 CASE WHEN b.xusertype IN (167, 175, 231, 239) THEN N'('+CONVERT(nvarchar, a.prec) + N')'
23 WHEN b.xusertype in (106, 108) THEN N'('+CONVERT(nvarchar, a.xprec) + N', ' + CONVERT(nvarchar, a.xscale) + N')'
24 ELSE '' END +
25 CASE a.isnullable WHEN 1 THEN N'' ELSE N' NOT' END + N' NULL' +
26 CASE WHEN d.Name IS NOT NULL THEN N' DEFAULT ' + d.Definition ELSE N'' END +
27 N','
28 FROM sys.syscolumns a
29 LEFT JOIN sys.systypes b ON a.xusertype = b.xusertype
30 LEFT JOIN sys.identity_columns c ON c.Object_id = a.ID AND c.Column_ID = a.ColID
31 LEFT JOIN sys.default_constraints d ON d.Parent_Object_ID = a.ID AND d.Parent_column_ID = a.ColID
32 WHERE a.[ID] = @ObjectID
33 ORDER BY a.ColOrder
34
35 --插入主键和索引
36 DECLARE @IndexID int, @IndexScript nvarchar(4000)
37 DECLARE IndexCursor CURSOR FOR
38 SELECT b.Index_ID, N' CONSTRAINT [' + a.Name + N'] ' +
39 CASE a.Type WHEN 'PK' THEN N'PRIMARY KEY ' WHEN 'UQ' THEN N'UNIQUE ' END +
40 CASE b.Type WHEN 1 THEN N'CLUSTERED' WHEN 2 THEN N'NONCLUSTERED ' END + N'('
41 FROM sys.key_constraints a
42 LEFT JOIN sys.indexes b ON b.Object_ID = a.Parent_Object_ID AND b.index_id = a.unique_index_id
43 WHERE a.Parent_Object_ID = @ObjectID
44 OPEN IndexCursor
45 FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript
46 WHILE @@FETCH_STATUS = 0
47 BEGIN
48 SELECT @IndexScript = @IndexScript + N'[' + INDEX_COL(object_name(@ObjectID), 2 , 1) + N'],'
49 FROM sys.index_columns
50 WHERE Object_ID = @ObjectID
51 AND Index_ID = 2
52
53 SET @IndexScript = LEFT(@IndexScript, LEN(@IndexScript) -1) + N'),'
54 INSERT INTO @TableScript(ScriptLine) VALUES(@IndexScript)
55 FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript
56 END
57 Close IndexCursor
58 DEALLOCATE IndexCursor
59
60 insert into @TableScript(ScriptLine) VALUES(')')
61 select * from @TableScript

  

posted on 2011-08-02 17:12  生命在于积累  阅读(298)  评论(0)    收藏  举报