2011-10-07 123 views
1

我试图让该表信息给一个表名,所以我写了这样的查询:获取表信息

SELECT so.name, sc.name, st.name, sc.length, CASE WHEN sc.status = 0x80 THEN 'Y' ELSE 'N' END AS IsIdent, ColOrder 
    FROM Asdim.dbo.sysobjects so 
    INNER JOIN Asdim.dbo.syscolumns sc 
    ON so.id= sc.id 
    INNER JOIN Asdim.dbo.systypes st 
    ON sc.xtype = st.xusertype 
    WHERE so.Name = 'Admin' 

的问题是,我有名字“管理员”两个表,但他们有不同的模式。所以当我运行这个查询时:

SELECT * FROM Asdim.dbo.sysobjects WHERE name LIKE 'Admin' 

我得到两个记录,因为表名是相同的。有没有一种方法可以根据模式名称过滤掉?

+0

看看http://stackoverflow.com/questions/917431/sql-server-return-schema-for-sysobjects。 – a1ex07

回答

1

您正在使用的视图都已被弃用,只是为了向后兼容而提供。使用新的视图给出。

SELECT t.name, 
     c.name, 
     ty.name, 
     c.is_identity, 
     c.max_length, 
     c.column_id 
FROM sys.tables t 
JOIN sys.schemas s ON s.schema_id=t.schema_id 
JOIN sys.columns c ON c.object_id = t.object_id 
JOIN sys.types ty ON ty.user_type_id = c.user_type_id 
WHERE t.name LIKE '%Admin%' AND s.name = 'dbo' 

INFORMATION_SCHEMA.COLUMNS拥有几乎所有你需要的信息,但缺少有关标识列的信息。

+0

太棒了谢谢你。正在寻找这个很长一段时间 – peter