获取对象信息

时间:2011-10-18 14:59:43

标签: sql sql-server tsql sql-server-2008

我正在尝试获取表格和列信息。所以我写了两个这样的查询:

SELECT * FROM Chag.sys.columns c
WHERE OBJECT_NAME(c.object_id)='Aduser'

SELECT * FROM Chag.sys.tables so
WHERE so.name = 'Aduser' AND SCHEMA_NAME(so.schema_id) = 'Tref'

当我在Chag数据库中执行它们时,这两个工作正常,但是当我在不同的数据库中执行它时,它们返回nothig。

我想在不同的数据库中执行它们,所以我该怎么做?

3 个答案:

答案 0 :(得分:3)

OBJECT_NAME()函数接受数据库ID的附加参数。对于SCHEMA_NAME(),您应该将其替换为OBJECT_SCHEMA_NAME(),它等同于SCHEMA_NAME(),只使用对象ID而不是模式ID,并接受数据库ID作为第二个(可选)参数。

您可以使用DB_ID()获取指定数据库的ID。

以下是您的陈述的修改版本:

SELECT *
FROM Chag.sys.columns c
WHERE OBJECT_NAME(c.object_id, DB_ID('Chag'))='Aduser'

SELECT *
FROM Chag.sys.tables so
WHERE so.name = 'Aduser'
  AND OBJECT_SCHEMA_NAME(so.object_id, DB_ID('Chag')) = 'Tref'

答案 1 :(得分:2)

如果原因在OBJECT_NAME中,SCHEMA_NAME就像Shark所指出的那样,那么从相应的视图中获取数据而不是调用这些函数可能有所帮助:

select c.* from chag.sys.columns c
join chag.sys.objects o on 
    c.object_id = o.object_id
where o.name = 'Aduser'

select t.* from chag.sys.tables t
join chag.sys.schemas s on
    t.schema_id = s.schema_id
where t.name = 'Aduser' and s.name = 'Tref'

答案 2 :(得分:0)

因为您使用的是Database.Schema.Object引用。尝试对其他数据库运行:

SELECT * FROM sys.columns c 
WHERE OBJECT_NAME(c.object_id)='Aduser' 

SELECT * FROM sys.tables so 
WHERE so.name = 'Aduser' AND SCHEMA_NAME(so.schema_id) = 'Tref' 

请注意,如果没有'Aduser'或'Tref'对象,那么您将无法获得结果。