标签:
--查看表生成脚本 USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* **************************************************************************** 功能描述: 获取指定表的创建脚本,包括表和字段的属性、外键(注释掉的) ---------------------------------------------------------------------------- 参数列表: 1: @TableName 需要创建脚本的表的名称 **************************************************************************** */ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N‘[dbo].[sp_HelpTable]‘) AND type in (N‘P‘, N‘PC‘)) DROP PROCEDURE [dbo].[sp_HelpTable] GO CREATE PROCEDURE [dbo].[sp_HelpTable](@TableName sysname) AS SET NOCOUNT ON DECLARE @ObjectID int DECLARE @TableScript table(Iden int IDENTITY(1, 1), ScriptLine nvarchar(4000)) SET @ObjectID = object_id(@TableName) IF @ObjectID IS NULL OR OBJECTPROPERTY(@ObjectID, ‘IsTable‘) = 0 BEGIN RAISERROR(‘指定的对象不是表对象‘, 16, 1) RETURN END --获取表的创建脚本 --插入表头 INSERT INTO @TableScript(ScriptLine) SELECT N‘CREATE TABLE [‘ + USER_NAME(OBJECTPROPERTY(@ObjectID, N‘OwnerId‘)) + N‘].[‘ + object_name(@ObjectID) + N‘](‘ --插入字段 INSERT INTO @TableScript(ScriptLine) SELECT N‘ [‘ + a.Name + N‘] [‘ + b.name + N‘]‘ + CASE WHEN c.Object_id IS NOT NULL THEN N‘ IDENTITY(‘ + CONVERT(nvarchar, c.seed_value) + N‘, ‘ + CONVERT(nvarchar, c.increment_value) + N‘)‘ ELSE ‘‘ END + CASE WHEN b.xusertype IN (167, 175, 231, 239) THEN N‘(‘+CONVERT(nvarchar, a.prec) + N‘)‘ WHEN b.xusertype in (106, 108) THEN N‘(‘+CONVERT(nvarchar, a.xprec) + N‘, ‘ + CONVERT(nvarchar, a.xscale) + N‘)‘ ELSE ‘‘ END + CASE a.isnullable WHEN 1 THEN N‘‘ ELSE N‘ NOT‘ END + N‘ NULL‘ + CASE WHEN d.Name IS NOT NULL THEN N‘ DEFAULT ‘ + d.Definition ELSE N‘‘ END + N‘,‘ FROM sys.syscolumns a LEFT JOIN sys.systypes b ON a.xusertype = b.xusertype LEFT JOIN sys.identity_columns c ON c.Object_id = a.ID AND c.Column_ID = a.ColID LEFT JOIN sys.default_constraints d ON d.Parent_Object_ID = a.ID AND d.Parent_column_ID = a.ColID WHERE a.[ID] = @ObjectID ORDER BY a.ColOrder --插入主键和索引 DECLARE @IndexID int, @IndexScript nvarchar(4000) DECLARE IndexCursor CURSOR FOR SELECT b.Index_ID, N‘ CONSTRAINT [‘ + a.Name + N‘] ‘ + CASE a.Type WHEN ‘PK‘ THEN N‘PRIMARY KEY ‘ WHEN ‘UQ‘ THEN N‘UNIQUE ‘ END + CASE b.Type WHEN 1 THEN N‘CLUSTERED‘ WHEN 2 THEN N‘NONCLUSTERED ‘ END + N‘(‘ FROM sys.key_constraints a LEFT JOIN sys.indexes b ON b.Object_ID = a.Parent_Object_ID AND b.index_id = a.unique_index_id WHERE a.Parent_Object_ID = @ObjectID OPEN IndexCursor FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript WHILE @@FETCH_STATUS = 0 BEGIN SELECT @IndexScript = @IndexScript + N‘[‘ + INDEX_COL(object_name(@ObjectID), 2 , 1) + N‘],‘ FROM sys.index_columns WHERE Object_ID = @ObjectID AND Index_ID = 2 SET @IndexScript = LEFT(@IndexScript, LEN(@IndexScript) -1) + N‘),‘ INSERT INTO @TableScript(ScriptLine) VALUES(@IndexScript) FETCH NEXT FROM IndexCursor INTO @IndexID, @IndexScript END CLOSE IndexCursor DEALLOCATE IndexCursor --除去最后一个,号 UPDATE @TableScript SET ScriptLine = LEFT(ScriptLine, LEN(ScriptLine) - 1) WHERE Iden = (SELECT MAX(Iden) FROM @TableScript) INSERT INTO @TableScript(ScriptLine) VALUES(N‘)‘) INSERT INTO @TableScript(ScriptLine) VALUES(N‘GO‘) INSERT INTO @TableScript(ScriptLine) VALUES(N‘‘) --获取表备注 DECLARE @PropScript nvarchar(4000) INSERT INTO @TableScript(ScriptLine) SELECT N‘EXEC sys.sp_addextendedproperty @name=N‘‘‘ + a.Name + N‘‘‘, @value=N‘‘‘ + CONVERT(nvarchar, a.Value) + N‘‘‘ ,@level0type=N‘‘SCHEMA‘‘, @level0name=N‘‘‘ + USER_NAME(OBJECTPROPERTY(a.major_Id, N‘OwnerId‘)) + N‘‘‘, @level1type=N‘‘TABLE‘‘, @level1name=N‘‘‘ + b.Name + N‘‘‘‘ FROM sys.extended_properties a LEFT JOIN sys.objects b ON b.[Object_ID] = a.major_Id WHERE a.major_Id = @ObjectID AND Minor_ID = 0 INSERT INTO @TableScript(ScriptLine) VALUES(‘GO‘) DECLARE PropCursor CURSOR FOR SELECT N‘EXEC sys.sp_addextendedproperty @name=N‘‘‘ + a.Name + N‘‘‘, @value=N‘‘‘ + CONVERT(nvarchar, a.Value) + N‘‘‘ ,@level0type=N‘‘SCHEMA‘‘, @level0name=N‘‘‘ + USER_NAME(OBJECTPROPERTY(a.major_Id, N‘OwnerId‘)) + N‘‘‘, @level1type=N‘‘TABLE‘‘, @level1name=N‘‘‘ + b.Name + N‘‘‘‘ + N‘, @level2type=N‘‘COLUMN‘‘, @level2name=N‘‘‘ + c.[Name] + ‘‘‘‘ FROM sys.extended_properties a LEFT JOIN sys.objects b ON b.[Object_ID] = a.major_Id LEFT JOIN sys.syscolumns c ON c.[ID] = a.major_Id AND c.ColID = a.Minor_ID WHERE a.major_Id = @ObjectID AND Minor_ID <> 0 OPEN PropCursor FETCH NEXT FROM PropCursor INTO @PropScript WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO @TableScript(ScriptLine) VALUES(@PropScript) INSERT INTO @TableScript(ScriptLine) VALUES(N‘GO‘) FETCH NEXT FROM PropCursor INTO @PropScript END CLOSE PropCursor DEALLOCATE PropCursor INSERT INTO @TableScript(ScriptLine) VALUES(‘‘) --获取表外键 DECLARE @ConstID int, @i tinyint, @keyCnt tinyint, @TempletSQL nvarchar(400), @SQLScript nvarchar(500), @FColName sysname, @RColName sysname, @ForeignLine nvarchar(4000), @ReferencesLine nvarchar(4000), @ReferencesAction nvarchar(4000) DECLARE @ConstIDTable table(ConstID int) SELECT @FColName = ‘‘, @RColName = ‘‘, @TempletSQL = N‘SELECT @eFColName = ‘‘[‘‘ + col_name(FkeyID, Fkey%d) + ‘‘]‘‘, @eRColName = ‘‘[‘‘ + col_name(RkeyID, Rkey%d) + ‘‘]‘‘ FROM sys.sysreferences WHERE ConstID = @ConstID‘ INSERT INTO @ConstIDTable SELECT ConstID FROM sys.sysreferences WHERE FKeyID = @ObjectID OR RKeyID = @ObjectID ORDER BY FKeyID WHILE EXISTS(SELECT * FROM @ConstIDTable) BEGIN SELECT TOP 1 @ConstID = ConstID FROM @ConstIDTable DELETE FROM @ConstIDTable WHERE ConstID = @ConstID INSERT INTO @TableScript SELECT N‘--ALTER TABLE [dbo].[‘ + object_name(FKeyID) + ‘] WITH CHECK‘ FROM sys.sysreferences WHERE ConstID = @ConstID INSERT INTO @TableScript(ScriptLine) VALUES(‘-- ADD‘ + CHAR(13) + CHAR(10)) SELECT @ForeignLine = N‘-- CONSTRAINT [‘ + object_name(ConstID) + ‘] FOREIGN KEY(‘, @ReferencesLine = N‘REFERENCES [dbo].[‘ + object_name(RKeyID) + ‘] (‘, @ReferencesAction = CASE b.Delete_Referential_Action WHEN 0 THEN N‘‘ WHEN 1 THEN N‘ON DELETE Cascade‘ WHEN 2 THEN N‘ON DELETE SET NULL‘ WHEN 3 THEN N‘ON DELETE SET DEFAULT‘ END + ‘ ‘ + CASE b.Delete_Referential_Action WHEN 0 THEN N‘‘ WHEN 1 THEN N‘ON UPDATE Cascade‘ WHEN 2 THEN N‘ON UPDATE SET NULL‘ WHEN 3 THEN N‘ON UPDATE SET DEFAULT‘ END, @keyCnt = KeyCnt FROM sys.sysreferences a LEFT JOIN sys.foreign_keys b ON a.ConstID = b.Object_ID WHERE a.ConstID = @ConstID --取字段 SET @i = 1 WHILE @i <= @keyCnt BEGIN SET @SQLScript = REPLACE(@TempletSQL, ‘%d‘, CONVERT(nvarchar, @i)) EXEC sp_executesql @stmt = @SQLScript, @params= N‘@eFColName sysname output, @eRColName sysname output, @ConstID int‘, @eFColName = @FColName output, @eRColName = @RColName output, @ConstID = @ConstID print @SQLScript SET @ForeignLine = @ForeignLine + CASE WHEN @i > 1 THEN ‘, ‘ ELSE ‘‘ END + @FColName SET @ReferencesLine = @ReferencesLine + CASE WHEN @i > 1 THEN ‘, ‘ ELSE ‘‘ END + @RColName SET @i = @i + 1 END INSERT INTO @TableScript(ScriptLine) VALUES(@ForeignLine + N‘) ‘ + @ReferencesLine + N‘)‘) IF @ReferencesAction <> ‘‘ INSERT INTO @TableScript(ScriptLine) VALUES(@ReferencesAction) --INSERT INTO @TableScript(ScriptLine) VALUES(N‘GO‘) END --返回表的创建脚本 SELECT ScriptLine FROM @TableScript SET NOCOUNT OFF GO --测试 USE LibrarySystem EXEC sp_HelpTable ‘BookInfoList‘ 对于查看视图,存储过程等系统有现成的.sp_helptext ---表结构 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create proc [dbo].[sp_table] (@tableName varchar(200) ,@ColumnLike varchar(200)=NULL) as --/******************************************** --根据表名得到表信息,包括字段说明 --*********************************************/ --DECLARE @tableName VARCHAR(200); --DECLARE @ColumnLike VARCHAR(200); --SET @tableName=‘purchase‘ --SET @ColumnLike=NULL; --如果表明不存在,就直接选出相似表 if not exists( select 1 from sysobjects where id = object_id(@tableName) and type = ‘U‘) begin select name from sysobjects where name like ‘%‘+@tableName + ‘%‘ and type = ‘U‘ return end --筛选相似列明 if(@ColumnLike is null) set @ColumnLike = ‘‘ declare @ColumnTable table(cName varchar(200)) insert @ColumnTable(cName) select a.name from syscolumns a,sysobjects d where a.id=d.id and d.name = @tableName and a.name like ‘%‘+ @ColumnLike +‘%‘ --查询表结构信息 SELECT 表名=case when a.colorder=1 then d.name else ‘‘ end, 表说明=case when a.colorder=1 then isnull(f.value,‘‘) else ‘‘ end, 字段序号=a.colorder, 字段名=a.name, 字段说明=isnull(g.[value],‘‘), 标识=case when COLUMNPROPERTY( a.id,a.name,‘IsIdentity‘)=1 then ‘√‘else ‘‘ end, 主键=case when exists(SELECT 1 FROM sysobjects where xtype=‘PK‘ and parent_obj=a.id and name in ( SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid ))) then ‘√‘ else ‘‘ end, 类型=b.name, 占用字节数=a.length, 长度=COLUMNPROPERTY(a.id,a.name,‘PRECISION‘), 小数位数=isnull(COLUMNPROPERTY(a.id,a.name,‘Scale‘),0), 允许空=case when a.isnullable=1 then ‘√‘else ‘‘ end, 默认值=isnull(e.text,‘‘) FROM syscolumns a left join systypes b on a.xusertype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype=‘U‘ and d.name<>‘dtproperties‘ left join syscomments e on a.cdefault=e.id left join sys.extended_properties g on a.id=g.major_id and a.colid=g.minor_id left join sys.extended_properties f on d.id=f.major_id and f.minor_id=0 --where d.name=‘要查询的表‘ --如果只查询指定表,加上此条件 where d.name = @tableName and exists(select 1 from @ColumnTable where cname = a.name) order by a.id,a.colorder GO ---查看函數,存儲過程代碼 create procedure dusp_helptext @objname nvarchar(776) ,@columnname sysname = NULL as set nocount on declare @dbname sysname ,@objid int ,@BlankSpaceAdded int ,@BasePos int ,@CurrentPos int ,@TextLength int ,@LineId int ,@AddOnLen int ,@LFCR int --lengths of line feed carriage return ,@DefinedLength int /* NOTE: Length of @SyscomText is 4000 to replace the length of ** text column in syscomments. ** lengths on @Line, #CommentText Text column and ** value for @DefinedLength are all 255. These need to all have ** the same values. 255 was selected in order for the max length ** display using down level clients */ ,@SyscomText nvarchar(4000) ,@Line nvarchar(255) select @DefinedLength = 255 select @BlankSpaceAdded = 0 /*Keeps track of blank spaces at end of lines. Note Len function ignores trailing blank spaces*/ CREATE TABLE #CommentText (LineId int ,Text nvarchar(255) collate database_default) /* ** Make sure the @objname is local to the current database. */ select @dbname = parsename(@objname,3) if @dbname is null select @dbname = db_name() else if @dbname <> db_name() begin raiserror(15250,-1,-1) return (1) end /* ** See if @objname exists. */ select @objid = object_id(@objname) if (@objid is null) begin raiserror(15009,-1,-1,@objname,@dbname) return (1) end -- If second parameter was given. if ( @columnname is not null) begin -- Check if it is a table if (select count(*) from sys.objects where object_id = @objid and type in (‘S ‘,‘U ‘,‘TF‘))=0 begin raiserror(15218,-1,-1,@objname) return(1) end -- check if it is a correct column name if ((select ‘count‘=count(*) from sys.columns where name = @columnname and object_id = @objid) =0) begin raiserror(15645,-1,-1,@columnname) return(1) end if (ColumnProperty(@objid, @columnname, ‘IsComputed‘) = 0) begin raiserror(15646,-1,-1,@columnname) return(1) end declare ms_crs_syscom CURSOR LOCAL FOR select text from syscomments where id = @objid and encrypted = 0 and number = (select column_id from sys.columns where name = @columnname and object_id = @objid) order by number,colid FOR READ ONLY end else if @objid < 0 -- Handle system-objects begin -- Check count of rows with text data if (select count(*) from master.sys.syscomments where id = @objid and text is not null) = 0 begin raiserror(15197,-1,-1,@objname) return (1) end declare ms_crs_syscom CURSOR LOCAL FOR select text from master.sys.syscomments where id = @objid ORDER BY number, colid FOR READ ONLY end else begin /* ** Find out how many lines of text are coming back, ** and return if there are none. */ if (select count(*) from syscomments c, sysobjects o where o.xtype not in (‘S‘, ‘U‘) and o.id = c.id and o.id = @objid) = 0 begin raiserror(15197,-1,-1,@objname) return (1) end if (select count(*) from syscomments where id = @objid and encrypted = 0) = 0 begin raiserror(15471,-1,-1,@objname) return (0) end declare ms_crs_syscom CURSOR LOCAL FOR select text from syscomments where id = @objid and encrypted = 0 ORDER BY number, colid FOR READ ONLY end /* ** else get the text. */ select @LFCR = 2 select @LineId = 1 OPEN ms_crs_syscom FETCH NEXT from ms_crs_syscom into @SyscomText WHILE @@fetch_status >= 0 begin select @BasePos = 1 select @CurrentPos = 1 select @TextLength = LEN(@SyscomText) WHILE @CurrentPos != 0 begin --Looking for end of line followed by carriage return select @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText, @BasePos) --If carriage return found IF @CurrentPos != 0 begin /*If new value for @Lines length will be > then the **set length then insert current contents of @line **and proceed. */ while (isnull(LEN(@Line),0) + @BlankSpaceAdded + @CurrentPos-@BasePos + @LFCR) > @DefinedLength begin select @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) + @BlankSpaceAdded) INSERT #CommentText VALUES ( @LineId, isnull(@Line, N‘‘) + isnull(SUBSTRING(@SyscomText, @BasePos, @AddOnLen), N‘‘)) select @Line = NULL, @LineId = @LineId + 1, @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0 end select @Line = isnull(@Line, N‘‘) + isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N‘‘) select @BasePos = @CurrentPos+2 INSERT #CommentText VALUES( @LineId, @Line ) select @LineId = @LineId + 1 select @Line = NULL end else --else carriage return not found begin IF @BasePos <= @TextLength begin /*If new value for @Lines length will be > then the **defined length */ while (isnull(LEN(@Line),0) + @BlankSpaceAdded + @TextLength-@BasePos+1 ) > @DefinedLength begin select @AddOnLen = @DefinedLength - (isnull(LEN(@Line),0) + @BlankSpaceAdded) INSERT #CommentText VALUES ( @LineId, isnull(@Line, N‘‘) + isnull(SUBSTRING(@SyscomText, @BasePos, @AddOnLen), N‘‘)) select @Line = NULL, @LineId = @LineId + 1, @BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0 end select @Line = isnull(@Line, N‘‘) + isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N‘‘) if LEN(@Line) < @DefinedLength and charindex(‘ ‘, @SyscomText, @TextLength+1 ) > 0 begin select @Line = @Line + ‘ ‘, @BlankSpaceAdded = 1 end end end end FETCH NEXT from ms_crs_syscom into @SyscomText end IF @Line is NOT NULL INSERT #CommentText VALUES( @LineId, @Line ) select Text from #CommentText order by LineId CLOSE ms_crs_syscom DEALLOCATE ms_crs_syscom DROP TABLE #CommentText return (0) -- sp_helptext
标签:
原文地址:http://www.cnblogs.com/geovindu/p/4828399.html