我正在尝试从(SQL Server 2008)数据库中选择各种表名和列名。数据库相当大。有几个数据库位于同一台服务器上,每个数据库都有各种模式等。一旦涉及到多部分标识符,我就会陷入困境。例如,要检索数据库下的表列表,这可以正常工作:
SELECT [name]
FROM DatabaseOne.sys.tables
ORDER BY [name]
然后我想在某个架构下获取表格。 E.g:
SELECT [name]
FROM DatabaseOne.SchemaOne.sys.tables
ORDER BY [name]
但我收到错误:
无法在sys.servers中找到服务器“DatabaseOne”。验证 指定了正确的服务器名称。如有必要,执行 存储过程sp_addlinkedserver将服务器添加到sys.servers。
问题的很大一部分可能在于我对模式一无所知(如果这甚至是它们的话)。
另外,如果我想在表中找到列名,比如说DatabaseOne.SchemaOne.TableOne,我该怎么做呢?
任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
如果使用四部分名称,则SQL假设第一部分是链接服务器的名称。
系统表位于sys
架构中,包含所有其他架构的数据,如dbo
或其他任何架构。
在sys.tables
中有一个schema_id
值,用于指定每个表所在的模式。还有一个sys.schemas
表,其中包含模式。
如果您知道架构名称,则可以执行
SELECT [name]
FROM DatabaseOne.sys.tables t
INNER JOIN sys.schemas s
ON s.schema_id = t.schema_id
WHERE s.name = 'MySchema'
ORDER BY [name]
您还可以通过s.name
评估IN
评估来检查多个模式。