【问题标题】:How to get column metadata from a table synonym如何从表同义词中获取列元数据
【发布时间】:2010-12-07 12:41:15
【问题描述】:

如何确定 SQL Server 2005 数据库中表 synonym 的列元数据?对于名为“Project”的表,我有一个名为“ProjectSyn”的同义词,但我找不到该同义词的列元数据。

我的猜测是在某处确定同义词的“基表”,然后查询该表的列元数据。这是一个正确的方法吗?如果不是,那会是什么?

【问题讨论】:

  • @Aliostad - 数据库对象的备用名称。在不破坏遗留代码的情况下重命名对象很有用(至少在理论上 - 有时抽象不像这个问题那样工作)。语法:CREATE SYNONYM ProjectSyn FOR Project
  • @Aliostad,我在 MSDN 介绍的术语同义词上添加了一个链接。

标签: sql sql-server synonym


【解决方案1】:

这是我的解决方案,适用于不同数据库的同义词:

SELECT TOP 0 * INTO #TEMP1 FROM YourTable 
SELECT
    [column_name] = c.name,
    [data_type] = t.name,
    [character_maximum_length] = c.max_length
FROM tempdb.sys.columns c
inner join tempdb.sys.types t on t.system_type_id = c.system_type_id
WHERE [object_id] = object_id('tempdb..#TEMP1');
DROP TABLE #TEMP1

【讨论】:

  • 列元数据呢?这不包括在这个答案中。
  • tempdb.sys.columns c 或 tempdb.sys.types t 包含您需要的元数据字段,例如 t.name 将提供类型名称。尝试使用 SELECT * 脚本查看可用字段。
  • 这很简单,并为我们提供了一些基础。如果第一行显示为:SELECT TOP 0 * INTO #TEMP1 FROM YourSynonym 会更清楚
【解决方案2】:

这样的? (已编辑)

select c.*
from
   sys.columns c
   inner join sys.synonyms s on c.object_id = object_id(s.base_object_name)
where
   s.name = 'ProjectSyn'

【讨论】:

  • 感谢@Jonas,但您的代码需要做一些工作。 OBJECT_NAME 函数给出一个非限定名称,其中 base_object_name 是完全限定的。
  • 当然,如果同义词是针对同一服务器上不同数据库中的对象,甚至是链接服务器上的对象,这将不返回任何内容。另请注意,如果同义词是用括号创建的,如[ProjectSyn],那么 base_object_name 列也需要包含这些。
  • @ErikE apc 的答案适用于数据库甚至链接服务器,无需匹配括号。
  • @Arkaine55 我不明白你为什么要告诉我一个与我评论的答案不同的答案。你的话完全不合逻辑。如果您想评论它适用于数据库和链接服务器的其他答案,请继续。但是,我会说跨链接服务器工作的唯一方法是查询链接服务器。针对本地 object_id 的查询不会针对链接服务器起作用。
【解决方案3】:

是的,我认为获取基础对象然后检索列是您唯一的选择。

要获取同义词的基础对象名称,只需查询视图sys.synonyms

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多