我们在使用数据库时,往往忘记或者不知道某些字段所代表的意思,这时候我们会在字段说明中标注。
那么当我们需要使用字段的中文说明时,应该怎么做呢?下面的Sql语句将可以解决这个问题:
SELECT
d.name as 表名,
a.colorder 字段序号,
a.name 字段名,
b.name 类型,
a.length 占用字节数,
g.[value] AS 字段说明
FROM syscolumns a left join systypes b
on a.xtype=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
order by a.id,a.colorder
应用:偶尔,一个窗体上需要对很多表进行查询,如果我们每一个需要查询和关联的表,都单独放一个Grid,那将是一个比较可怕的操作,如果只放一个Grid,那么列头的显示,又是一个问题,更何况,有时候,我们可能根本不知道对哪些表进行查询。这时候,只要为每一个字段标注中文属性,就可以如下操作:
ASql := 'select * from V_GetFieldsCnName where 表名=' + QuotedStr('表名');
If GetDataset(ASql, ADQ_Temp) > 0 Then //打开数据集,返回查询出的数据条数
Begin
ADQ_Temp.First;
While Not ADQ_Temp.Eof Do
Begin
cxGrid2DBTableView1.CreateColumn;
cxGrid2DBTableView1.Columns[Aint].DataBinding.FieldName := ADQ_Temp.FieldByName('字段名').AsString;
cxGrid2DBTableView1.Columns[Aint].Width := 100;
If Trim(ADQ_Temp.FieldByName('字段说明').AsString) <> '' Then
cxGrid2DBTableView1.Columns[Aint].Caption := Trim(ADQ_Temp.FieldByName('字段说明').AsString)
else //如果控制显示,那么把if语句放到程序块外,当字段说明为空时,则不创建 Column
cxGrid2DBTableView1.Columns[Aint].Caption := Trim(ADQ_Temp.FieldByName('字段名').AsString);
Aint := Aint + 1;
ADQ_Temp.Next;
End;
End;
V_GetFieldsCnName 是一个视图,生成语句是:
CREATE VIEW [dbo].[V_GetFieldsCnName]
AS
SELECT TOP (100) PERCENT d.name AS 表名, a.colorder AS 字段序号, a.name AS 字段名, b.name AS 类型, a.length AS 占用字节数, g.value AS 字段说明
FROM sys.syscolumns AS a LEFT OUTER JOIN
sys.systypes AS b ON a.xtype = b.xusertype INNER JOIN
sys.sysobjects AS d ON a.id = d.id AND d.xtype = 'U' AND d.name <> 'dtproperties' LEFT OUTER JOIN
sys.syscomments AS e ON a.cdefault = e.id LEFT OUTER JOIN
sys.extended_properties AS g ON a.id = g.major_id AND a.colid = g.minor_id
ORDER BY a.id, 字段序号