首页 新闻 会员 周边 捐助

Sql中有类似这样得到元数据的函数或方法吗?

0
悬赏园豆:60 [已解决问题] 解决于 2012-08-21 13:21

select * from getMetaInfo(select *,1 from customer)

希望有一种方式,在sql语句内部得到另外一个select语句的元数据,而不是在sql执行完毕以后,通过驱动得到sql语句的列数据等信息。

走在溪边的主页 走在溪边 | 初学一级 | 园豆:89
提问于:2012-08-17 09:48
< >
分享
最佳答案
0

表的元数据包括你建表所包含的字段,字段名,字段数据类型,字段约束等.可以用下面的语句查:

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函数就可以了

收获园豆:40
acepro | 小虾三级 |园豆:1218 | 2012-08-17 15:18

很不错的语句!学习了。

  只是这样得到是一个表的元数据,而我希望得到的是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语句的元数据,主要是列信息,则指示语句就可以写的相对简单。

走在溪边 | 园豆:89 (初学一级) | 2012-08-18 17:41
其他回答(2)
0

这个貌似没见过

收获园豆:10
┢┦偉 | 园豆:1240 (小虾三级) | 2012-08-17 11:18
0

元数据 是神马?

收获园豆:10
八戒的师傅 | 园豆:1472 (小虾三级) | 2012-08-17 11:38

得到后一个select语句数据列的一些信息, 在数据输出前, 根据这些信息做一些必要的加工。

支持(0) 反对(0) 走在溪边 | 园豆:89 (初学一级) | 2012-08-17 11:54

@走在溪边: 才疏学浅……不明白

支持(0) 反对(0) 八戒的师傅 | 园豆:1472 (小虾三级) | 2012-08-17 12:49

@八戒的师傅: 汗.

支持(0) 反对(0) 走在溪边 | 园豆:89 (初学一级) | 2012-08-17 16:15

用DataTable.Schema()方法得到的就是所谓的元数据。(真心的说,这个”元数据“的翻译真烂……)

支持(0) 反对(0) 需要格局 | 园豆:2145 (老鸟四级) | 2012-08-20 14:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册