<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: datadictionary code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Thu, 24 Jul 2008 06:39:41 GMT</pubDate>
    <description>DZone Snippets: datadictionary code</description>
    <item>
      <title>system_function_schema.fn_datadictionary</title>
      <link>http://snippets.dzone.com/posts/show/1175</link>
      <description>The following lengthy SQL script will create a system function in SQL Server that returns a data dictionary for any database on the server when called like this:&lt;br /&gt;&lt;br /&gt;select * from ::fn_datadictionary()&lt;br /&gt;&lt;br /&gt;The output includes the Description of the objects.&lt;br /&gt;&lt;br /&gt;Oskar Austegard&lt;br /&gt;&lt;a href="http://mo.notono.us"&gt;http://mo.notono.us&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;EXEC SP_CONFIGURE 'ALLOW UPDATES', 1&lt;br /&gt;RECONFIGURE WITH OVERRIDE&lt;br /&gt;USE master&lt;br /&gt;go&lt;br /&gt;CREATE FUNCTION system_function_schema.fn_datadictionary ()&lt;br /&gt;RETURNS @DataDictionary TABLE (&lt;br /&gt; object_id int,&lt;br /&gt; object_name nvarchar(128),&lt;br /&gt; object_type nvarchar(128),&lt;br /&gt; column_order int NULL,&lt;br /&gt; column_name varchar(60) NULL,&lt;br /&gt; column_datatype varchar(20) NULL,&lt;br /&gt; column_length int NULL,&lt;br /&gt; object_description varchar(500) NULL&lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt; DECLARE @object_name nvarchar(128)&lt;br /&gt;-------------------------&lt;br /&gt;--Tables and Columns&lt;br /&gt;-------------------------&lt;br /&gt; DECLARE table_cursor CURSOR FOR &lt;br /&gt;  SELECT name FROM sysobjects &lt;br /&gt;  WHERE type IN ('U') AND status &gt; 1 ORDER BY name&lt;br /&gt;&lt;br /&gt; OPEN table_cursor&lt;br /&gt; FETCH NEXT FROM table_cursor INTO @object_name&lt;br /&gt; WHILE @@FETCH_STATUS = 0&lt;br /&gt; BEGIN&lt;br /&gt;  --Tables&lt;br /&gt;  INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'Table',&lt;br /&gt;   column_order = 0, column_name = NULL, &lt;br /&gt;   column_datatype = NULL, column_length = NULL,&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o &lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'table', @object_name, null, default) e &lt;br /&gt;    ON o.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;&lt;br /&gt;  --Columns&lt;br /&gt;   INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'Table Column',&lt;br /&gt;    column_order = c.colorder, column_name = c.[name], &lt;br /&gt;   column_datatype = t.[name], column_length = c.[length],&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o INNER JOIN syscolumns c ON o.id = c.id INNER JOIN systypes t ON c.xtype = t.xtype&lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'table', @object_name, N'column', null) e &lt;br /&gt;    ON c.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;  ORDER BY c.colorder&lt;br /&gt;&lt;br /&gt;    FETCH NEXT FROM table_cursor INTO @object_name&lt;br /&gt; END&lt;br /&gt; CLOSE table_cursor&lt;br /&gt; DEALLOCATE table_cursor&lt;br /&gt;&lt;br /&gt;-------------------------&lt;br /&gt;--Views and Columns&lt;br /&gt;-------------------------&lt;br /&gt; DECLARE view_cursor CURSOR FOR &lt;br /&gt;  SELECT name FROM sysobjects &lt;br /&gt;  WHERE type IN ('V') AND status &gt; 1 ORDER BY name&lt;br /&gt;&lt;br /&gt; OPEN view_cursor&lt;br /&gt; FETCH NEXT FROM view_cursor INTO @object_name&lt;br /&gt; WHILE @@FETCH_STATUS = 0&lt;br /&gt; BEGIN&lt;br /&gt;  --Views&lt;br /&gt;  INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'View',&lt;br /&gt;   column_order = 0, column_name = NULL, &lt;br /&gt;   column_datatype = NULL, column_length = NULL,&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o &lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'view', @object_name, null, default) e &lt;br /&gt;    ON o.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;&lt;br /&gt;  --Columns&lt;br /&gt;   INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'View Column',&lt;br /&gt;    column_order = c.colorder, column_name = c.[name], &lt;br /&gt;   column_datatype = t.[name], column_length = c.[length],&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o INNER JOIN syscolumns c ON o.id = c.id INNER JOIN systypes t ON c.xtype = t.xtype&lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'view', @object_name, N'column', null) e &lt;br /&gt;    ON c.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;  ORDER BY c.colorder&lt;br /&gt;&lt;br /&gt;    FETCH NEXT FROM view_cursor INTO @object_name&lt;br /&gt; END&lt;br /&gt; CLOSE view_cursor&lt;br /&gt; DEALLOCATE view_cursor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;--Procedures and Parameters&lt;br /&gt;---------------------------&lt;br /&gt; DECLARE proc_cursor CURSOR FOR &lt;br /&gt;  SELECT name FROM sysobjects &lt;br /&gt;  WHERE type IN ('P') AND status &gt; 1 ORDER BY name&lt;br /&gt;&lt;br /&gt; OPEN proc_cursor&lt;br /&gt; FETCH NEXT FROM proc_cursor INTO @object_name&lt;br /&gt; WHILE @@FETCH_STATUS = 0&lt;br /&gt; BEGIN&lt;br /&gt;  --Procedures&lt;br /&gt;  INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'Procedure',&lt;br /&gt;   column_order = 0, column_name = NULL, &lt;br /&gt;   column_datatype = NULL, column_length = NULL,&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o &lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'procedure', @object_name, null, default) e &lt;br /&gt;    ON o.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;&lt;br /&gt;  --Parameters&lt;br /&gt;   INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'Procedure Parameter',&lt;br /&gt;    column_order = c.colorder, column_name = c.[name], &lt;br /&gt;   column_datatype = t.[name], column_length = c.[length],&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o INNER JOIN syscolumns c ON o.id = c.id INNER JOIN systypes t ON c.xtype = t.xtype&lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'procedure', @object_name, N'parameter', null) e &lt;br /&gt;    ON c.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;   AND t.name &lt;&gt; 'sysname'&lt;br /&gt;  ORDER BY c.colorder&lt;br /&gt;&lt;br /&gt;    FETCH NEXT FROM proc_cursor INTO @object_name&lt;br /&gt; END&lt;br /&gt; CLOSE proc_cursor&lt;br /&gt; DEALLOCATE proc_cursor&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;--Functions and Parameters&lt;br /&gt;---------------------------&lt;br /&gt; DECLARE func_cursor CURSOR FOR &lt;br /&gt;  SELECT name FROM sysobjects &lt;br /&gt;  WHERE type IN ('FN', 'TF', 'IF') AND status &gt; 1 ORDER BY name&lt;br /&gt;&lt;br /&gt; OPEN func_cursor&lt;br /&gt; FETCH NEXT FROM func_cursor INTO @object_name&lt;br /&gt; WHILE @@FETCH_STATUS = 0&lt;br /&gt; BEGIN&lt;br /&gt;  --Functions&lt;br /&gt;  INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'Function',&lt;br /&gt;   column_order = 0, column_name = NULL, &lt;br /&gt;   column_datatype = NULL, column_length = NULL,&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o &lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'function', @object_name, null, default) e &lt;br /&gt;    ON o.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;&lt;br /&gt;  --Parameters&lt;br /&gt;   INSERT @DataDictionary &lt;br /&gt;  SELECT object_id = o.[id], object_name = o.[name], object_type = 'Function Parameter',&lt;br /&gt;    column_order = c.colorder, &lt;br /&gt;   column_name = CASE WHEN c.[name] = '' THEN '' ELSE c.[name] END, &lt;br /&gt;   column_datatype = t.[name], column_length = c.[length],&lt;br /&gt;    object_description = LTRIM(CAST(e.value AS varchar(500)))&lt;br /&gt;  FROM sysobjects o INNER JOIN syscolumns c ON o.id = c.id INNER JOIN systypes t ON c.xtype = t.xtype&lt;br /&gt;   LEFT JOIN ::FN_LISTEXTENDEDPROPERTY(N'MS_Description', N'user',N'dbo',N'function', @object_name, N'parameter', null) e &lt;br /&gt;    ON c.name = e.objname&lt;br /&gt;  WHERE o.name = @object_name&lt;br /&gt;   AND t.name &lt;&gt; 'sysname'&lt;br /&gt;  ORDER BY c.colorder&lt;br /&gt;&lt;br /&gt;    FETCH NEXT FROM func_cursor INTO @object_name&lt;br /&gt; END&lt;br /&gt; CLOSE func_cursor&lt;br /&gt; DEALLOCATE func_cursor&lt;br /&gt; RETURN&lt;br /&gt;END&lt;br /&gt;GO&lt;br /&gt;EXEC SP_CONFIGURE 'ALLOW UPDATES', 0&lt;br /&gt;RECONFIGURE WITH OVERRIDE&lt;br /&gt;GO&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 19 Jan 2006 02:19:01 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1175</guid>
      <author>austegard (Oskar Austegard)</author>
    </item>
  </channel>
</rss>
