
数据库数据字典是一组表和视图结构。它们存放在SYSTEM表空间中。
数据库数据字典不仅是每个数据库的中心。而且对每个用户也是非常重要的信息。用户可以用SQL语句访问数据库数据字典。
生成数据库参考代码如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:<Carbe>
-- Create date: <2014-09-19>
-- Description:<生成数据库字典>
-- =============================================
CREATE PROCEDURE [dbo].[CreateDatabaseDictionarie]
AS
BEGIN
DECLARE @TableName nvarchar(35),@htmls varchar(8000)
DECLARE @字段名称 VARCHAR(200)
DECLARE @类型 VARCHAR(200)
DECLARE @长度 VARCHAR(200)
DECLARE @数值精度 VARCHAR(200)
DECLARE @小数位数 VARCHAR(200)
DECLARE @默认值 VARCHAR(200)
DECLARE @允许为空 VARCHAR(200)
DECLARE @外键 VARCHAR(200)
DECLARE @主键 VARCHAR(200)
DECLARE @描述 VARCHAR(200)
SET NOCOUNT ON
DECLARE Tbls CURSOR
FOR
Select distinct Table_name
FROM INFORMATION_SCHEMA.COLUMNS
order by Table_name
OPEN Tbls
PRINT '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
PRINT '<html xmlns="http://www.w3.org/1999/xhtml">'
PRINT '<head>'
PRINT '<title>KC管理系统-数据库字典</title>'
PRINT '<style type="text/css">'
PRINT 'body{margin:0font:11pt "arial", "微软雅黑"cursor:default}'
PRINT '.tableBox{margin:10px autopadding:0pxwidth:1000pxheight:autobackground:#FBF5E3border:1px solid #45360A}'
PRINT '.tableBox h3 {font-size:12ptheight:30pxline-height:30pxbackground:#45360Apadding:0px 0px 0px 15pxcolor:#FFFmargin:0pxtext-align:left }'
PRINT '.tableBox table {width:1000pxpadding:0px }'
PRINT '.tableBox th {height:25pxborder-top:1px solid #FFFborder-left:1px solid #FFFbackground:#F7EBC8border-right:1px solid #E0C889border-bottom:1px solid #E0C889 }'
PRINT '.tableBox td {height:25pxpadding-left:10pxborder-top:1px solid #FFFborder-left:1px solid #FFFborder-right:1px solid #E0C889border-bottom:1px solid #E0C889 }'
PRINT '</style>'
PRINT '</head>'
PRINT '<body>'
FETCH NEXT FROM Tbls INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
Select @htmls = '<h3>' + @TableName + ' : '+ CAST(Value as varchar(1000)) + '</h3>'
FROM sys.extended_properties AS A
WHERE A.major_id = OBJECT_ID(@TableName)
and name = 'MS_Description' and minor_id = 0
PRINT '<div class="tableBox">'
PRINT @htmls
PRINT '<table cellspacing="0">'
PRINT '<tr>'
PRINT '<th>字段名称</th>'
PRINT '<th>类型</th>'
PRINT '<th>长度</th>'
PRINT '<th>数值精度</th>'
PRINT '<th>小数位数</th>'
PRINT '<th>默认值</th>'
PRINT '<th>允许为空</th>'
PRINT '<th>外键</th>'
PRINT '<th>主键</th>'
PRINT '<th>描述</th>'
PRINT '</tr>'
DECLARE TRows CURSOR
FOR
SELECT
'<td>' + CAST(clmns.name AS VARCHAR(35)) + '</td>',
'<td>' + CAST(udt.name AS CHAR(15)) + '</td>' ,
'<td>' + CAST(CAST(CASE WHEN typ.name IN (N'nchar', N'nvarchar') AND clmns.max_length <>-1 THEN clmns.max_length/2 ELSE clmns.max_length END AS INT) AS VARCHAR(20)) + '</td>',
'<td>' + CAST(CAST(clmns.precision AS INT) AS VARCHAR(20)) + '</td>',
'<td>' + CAST(CAST(clmns.scale AS INT) AS VARCHAR(20)) + '</td>',
'<td>' + isnull(CAST(cnstr.definition AS VARCHAR(20)),'') + '</td>',
'<td>' + CAST(clmns.is_nullable AS VARCHAR(20)) + '</td>' ,
'<td>' + CAST(clmns.is_computed AS VARCHAR(20)) + '</td>' ,
'<td>' + CAST(clmns.is_identity AS VARCHAR(20)) + '</td>' ,
'<td>' + ISNULL(CAST(exprop.value AS VARCHAR(500)),'') + '</td>'
FROM sys.tables AS tbl
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
LEFT OUTER JOIN sys.indexes AS idx ON idx.object_id = clmns.object_id AND 1 =idx.is_primary_key
LEFT OUTER JOIN sys.index_columns AS idxcol ON idxcol.index_id = idx.index_id AND idxcol.column_id = clmns.column_id AND idxcol.object_id = clmns.object_id AND 0 = idxcol.is_included_column
LEFT OUTER JOIN sys.types AS udt ON udt.user_type_id = clmns.user_type_id
LEFT OUTER JOIN sys.types AS typ ON typ.user_type_id = clmns.system_type_id AND typ.user_type_id = typ.system_type_id
LEFT JOIN sys.default_constraints AS cnstr ON cnstr.object_id=clmns.default_object_id
LEFT OUTER JOIN sys.extended_properties exprop ON exprop.major_id = clmns.object_id AND exprop.minor_id = clmns.column_id AND exprop.name = 'MS_Description'
WHERE (tbl.name = @TableName and exprop.class = 1) --I don't wand to include comments on indexes
ORDER BY clmns.column_id ASC
OPEN TRows
FETCH NEXT FROM TRows INTO @字段名称,@类型,@长度,@数值精度,@小数位数,@默认值,@允许为空,@外键,@主键,@描述
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT '<tr>'
PRINT @字段名称
PRINT @类型
PRINT @长度
PRINT @数值精度
PRINT @小数位数
PRINT @默认值
PRINT @允许为空
PRINT @外键
PRINT @主键
PRINT @描述
PRINT '</tr>'
FETCH NEXT FROM TRows INTO @字段名称,@类型,@长度,@数值精度,@小数位数,@默认值,@允许为空,@外键,@主键,@描述
END
CLOSE TRows
DEALLOCATE TRows
PRINT '</table>'
PRINT '</div>'
FETCH NEXT FROM Tbls INTO @TableName
END
PRINT '</body>'
PRINT '</html>'
CLOSE Tbls
DEALLOCATE Tbls
END
需求已知一个数据(字符串,数值等)是从一个数据库中查询出的,但是数据库表以及表结构不知。需要通过该值查找出所保存的表名以及字段名,目标暂定为SqlServer。Oracle思路明白也可作出。该问题来源于一个同事提出,数据交换时,由于现有系统是由第三方软件提供商设计,数据库不提供,在此对这种行为表示鄙视!本文并非是用来解决该问题的解决方案,毕竟不是常规的方法,最好是由客户出面协商解决。本文只是一种方法的研究,前期阶段可以暂时如此。分析如果已知表和字段结构,查找已知字段的固定或不固定值,是很简单的,用简单sql语句查询即可,如: SELECT FIELD FROM TABLE WHERE FIELD LIKE '%STRING%'现在只知道STRING的值,需要知道FIELD 和 TABLE,可以通过数据库中的数据字典查出。数据字典的查找方法见本人另一篇日志 SqlServer2005数据库字典通过遍历轮询数据库中所有的表的所有符合字段,查出该表的该字段是否存在数据值。即通过数据库中的数据字典,构造轮询查找所有表所有字段的语句,得出是否存在对应数值。最后形式为很多个SELECT 语句,都进行查询。解决方法思路明确后,就能往下进行了,通过网络搜索,居然也有人遇到如此问题,而且对SqlServer的构造查询语句查询的TSQL也已经有了,对此申明:本人不是拿来主义者,只是思路刚好一致了,网络真是个神奇的地方。源码SQL代码 解释如下:先通过对数据字典查询,构造出SQL查询语句列表,然后用游标对该列表逐一执行查询语句。经测试成功,但有些地方待改进。经测试,上述代码能够查询系统中所有表的所有字段,但是登陆用户不同,结果有差异。原因为没有限定查询的Schema,对SYS和DBO查询没问题,但SYS架构一般不需要,其他需要的架构又直接去除了架构名称。所以会有问题,比如DBO2.TABLE1,上述查询语句仍然为SELECT ... FROM TABLE1,会出错。经修正后的语句如下,以后可以根据需求自己修改:就是维护整个数据库运行的内部表。属于数据库系统的表。oracle官方的解释是
One of the most important parts of an Oracle database is its data dictionary, which is a read-only set of tables that provides information about the database. A data dictionary contains:
The definitions of all schema objects in the database (tables, views, indexes, clusters, synonyms, sequences, procedures, functions, packages, triggers, and so on)
How much space has been allocated for, and is currently used by, the schema objects
Default values for columns
Integrity constraint information
The names of Oracle users
Privileges and roles each user has been granted
Auditing information, such as who has accessed or updated various schema objects
Other general database information
The data dictionary is structured in tables and views, just like other database data. All the data dictionary tables and views for a given database are stored in that database's SYSTEM tablespace.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)