表的元数据包括你建表所包含的字段,字段名,字段数据类型,字段约束等.可以用下面的语句查:
SELECT cast((case when a.colorder=1 then d.name else '' end) as varchar) 表名,
a.colorder 字段序号,
cast(a.name as varchar) 字段名,
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) 标识,
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then convert(char(4),IDENT_SEED(d.name)) else '' end)标识SEED,
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then convert(char(4),IDENT_INCR(d.name)) else '' end)标识INCR,
(case when (SELECT count(*) FROM sysobjects WHERE (name in
(SELECT name FROM sysindexes WHERE (id = a.id) AND (indid in
(SELECT indid FROM sysindexkeys WHERE (id = a.id) AND (colid in
(SELECT colid FROM syscolumns WHERE (id = a.id) AND (name = a.name)))))))
AND (xtype = 'PK'))>0 then '√' else '' end) 主键,
cast(b.name as varchar) 类型,
a.length 占用字节数,
COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,
(case when a.isnullable=1 then '√'else '' end) 允许空,
cast(isnull(e.text,'') as varchar) 默认值,
isnull(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 sysproperties g on a.id=g.id AND a.colid = g.smallid
where d.name = 'customer' --你查询的数据表名
order by a.id,a.colorder
--如果要查表的触发器可以用
select a.name 触发器,B.name 数据表 from sysobjects a,sysobjects b
where b.id=a.deltrig
and a.type='tr' AND b.name='customer' --你查询的数据表名
大多数表的元数据都可以通过系统表查询出来,楼主可以复习下sysobjects ,syscolumns ,sysindexes
等系统表字段的意思,想方便使用就将上面的语句定义成 查询表元数据的SQL函数就可以了。
很不错的语句!学习了。
只是这样得到是一个表的元数据,而我希望得到的是select语句的元数据。
这个问题来源于一个SQL语句转换程序,假如有下面有下面业务逻辑层的SQL语句:
!option xml(SaleOrderSet SaleOrder) --指定xml设置
!option page(SaleOrderNo,$PageIndex=1,$PageNumber=20) --指定分页设置
!option use [订单] ( [订单$商品]) --指定查询语句使用了订单逻辑表,同时订单包含订单产品信息 Select * from [订单] --查询语句
上面!option是一些指示,备注上加了一些说明。现在对上面的语句进行转换,生成数据层的SQL语句,假定执行转换的用户是'0102'。转换的结果如下:
declare @EmpID uniqueidentifier,
@UserNo varchar(80)
declare @PageSize int,
@PageIndex int
set @UserNo = '0102'
set @PageSize = 30
set @PageIndex = 2
select top 1 @empid = b.AssignmentID
from SysUser a, HR_Assignment b, HR_Person c
where a.PersonID=b.PersonID and
b.PersonID = c.PersonID and
c.EmployeeNo = @UserNo;
with
用户 as (select * from dbo.用户(@EmpID)),
职员 as (select * from dbo.职员()),
客户 as (select * from Customer
where Exists( --用户客户资源分配有团队权限
select * from [职员],[用户]
where 职员.任职ID = Customer.EmployeeID and
职员.团队 = 用户.团队)
union
select * from Customer
where Exists ( --用户客户资源分配有部门权限
select * from [职员],[用户]
where 职员.任职ID = Customer.EmployeeID and
职员.部门 = 用户.部门)
),
订单_ as (
select * from SalesOrder
where Exists( --订单资源按客户分配
select * from [客户]
where 客户.CustomerID = SalesOrder.CustomerID)
),
订单 as (
select * from SalesOrder,SaleOrderItem
where SaleOrder.SaleOrderID = SaleOrderItem.SaleOrderID
),
select
row_number() over(order by SaleOrderNo asc) as RowNumber,
*
from (select * from select * from [订单]) as a
where (RowNumber between @PageSize*(@PageIndex - 1) + 1 AND @PageSize * @PageIndex )
order by isNull(SaleOrderNo,'')
for xml path('SaleOrder'),root('SaleOrderSet')
为保证转换的正确性,在上面的转换过程中,要保证以下两点准则:
1、逻辑层的select语句是一个整体。在上面语句中,我用蓝色标出了原始的查询语句,语句可以整体当成数据集,但语句里面的选择、条件等构成部分都不能修改。
2、没有能力、也没有必要去分析SQL语句。
执行以上SQL语句会出现下面的结果:
<SaleOrderSet>
<SaleOrder>
<SaleOrderID>...<SaleOrderID>
<SaleOrderNo>..<SaleOrderNo>
<CustomerID>..</CustomerID>
<ExportPortNo>..</ExportPortNo>
</SaleOrder>
...
<SaleOrderSet>
以上的CustomerID与"[客户]" 关联,<ExportPortNo>与"[港口]"关联,我们希望生成以下结果集:
<SaleOrderSet>
<SaleOrder>
<SaleOrderID>...<SaleOrderID>
<SaleOrderNo>..<SaleOrderNo>
<CustomerID _display="...">..</CustomerID>
<ExportPortNo _display="...">..</ExportPortNo>
</SaleOrder>
...
<SaleOrderSet>
为达到以上目的,需要加一个指示,比如 !option ddlb(auto) ,但现在碰到困难了,根据上面的转换准则二,我们没有办法知道那些列是需要进行关联操作的,这样转换也无从谈起了。当然这些信息可以通过指示语句逐一指出,但如果在Sql中可以得到Select语句的元数据,主要是列信息,则指示语句就可以写的相对简单。
这个貌似没见过
元数据 是神马?
得到后一个select语句数据列的一些信息, 在数据输出前, 根据这些信息做一些必要的加工。
@走在溪边: 才疏学浅……不明白
@八戒的师傅: 汗.
用DataTable.Schema()方法得到的就是所谓的元数据。(真心的说,这个”元数据“的翻译真烂……)