代码之家  ›  专栏  ›  技术社区  ›  Cade Roux

对象\另一个数据库中对象的ID-如何查找数据库ID或名称/完全限定的对象名称?

  •  13
  • Cade Roux  · 技术社区  · 16 年前

    例子:

    USE AnotherDB
    -- This works - same ID as from other DB
    SELECT OBJECT_ID('AnotherDB.ASchema.ATable')
    -- This works
    SELECT OBJECT_NAME(OBJECT_ID('AnotherDB.ASchema.ATable'))
    
    USE ThisDB
    -- This works - same ID as from other DB
    SELECT OBJECT_ID('AnotherDB.ASchema.ATable')
    -- Gives NULL
    SELECT OBJECT_NAME(OBJECT_ID('AnotherDB.ASchema.ATable'))
    

    显然,元数据函数需要一个当前数据库。对于以下函数,BOL条目通常具有如下语言 OBJECT_NAME

    Microsoft SQL Server 2005数据库 引擎假定对象_id处于 在中引用对象\u id的查询 另一个数据库返回NULL或 结果不正确。

    我需要能够做到这一点的原因:

    1. 我无法在其他数据库或master(或除我自己的数据库之外的任何其他数据库)中创建代理UDF存根(或更改任何内容)来帮助我。

    那么,我怎样才能从中获取数据库呢 OBJECT_ID('AnotherDB.ASchema.ATable')

    我的目标是从配置表中获取可能部分限定的名称,在当前上下文中将其解析为完全限定的名称,使用PARSENAME获取数据库名称,然后使用DynamicSQL构建一个脚本,以便能够使用 database.sys.* USE db; sys.*

    5 回复  |  直到 16 年前
        1
  •  24
  •   gbn    16 年前

    您应该能够做到这一点:

    SELECT
       name
    FROM
        AnotherDB.sys.objects   --changes context
    WHERE
        object_id = OBJECT_ID('AnotherDB.ASchema.ATable')
    

    OBJECT_ID('AnotherDB.ASchema.ATable')

    这意味着您可以依赖dbname.sys.objects并避免与元数据函数混淆。

    注:该 new Catalog views 因此,您可以安全地依赖sys.objects,而不是元数据功能。

        2
  •  10
  •   Brimstedt    16 年前

    我是否正确理解您想要另一个db的db id?

    SELECT *
    FROM    master..sysdatabases
    WHERE   name = 'AnotherDB'
    

    否则,如果有帮助,您可以在动态SQL中使用其他数据库:

    DECLARE @SQL    NVARCHAR(MAX)
    ,   @objId  INT
    
    SET @SQL = N'
        USE AnotherDB
    
        SELECT  @id = OBJECT_ID(''customer'')
    '
    
    EXEC SP_EXECUTESQL @SQL
        ,   N'@id INT OUTPUT'
        ,   @id = @objId OUTPUT
    
    SELECT  @objId
    

    EXEC AnotherDB.dbo.ProcedureName 
          @paramX = ...
    ,     @paramY = ...
    
        3
  •  5
  •   boydc7    16 年前

    PARSENAME function in TSQL -将允许您提取完全(或非完全)限定名称的任何四部分。对于示例中的数据库:

    select parsename('AnotherDB.ASchema.ATable',3)
    

    返回:

    select parsename('AnotherDB.ASchema.ATable',2)
    

    返回:

    阿斯切马

    如果是非完全限定的,则如果您请求名称中未包含在字符串中的部分,则将得到null结果:

    select parsename('ASchema.ATable',3)
    

    返回:

        4
  •  2
  •   Nick    9 年前

    我也有同样的问题,但是OJBECT_SCHEMA_的名字也有问题。下面是chadhoc使用parsename的响应,它与OBJECT_NAME一起工作,如下所示:

    DECLARE @OrigTableName NVARCHAR(MAX);
    
    SELECT @OrigTableName = 'AnotherDB.ASchema.ATable'
    
    SELECT OBJECT_NAME(OBJECT_ID(@OrigTableName), DB_ID(PARSENAME(@OrigTableName, 3)))
    , OBJECT_SCHEMA_NAME(OBJECT_ID(@OrigTableName), DB_ID(PARSENAME(@OrigTableName, 3)))
    
        5
  •  0
  •   Mark    7 年前

    DECLARE @SchemaName varchar(255) = 'SchemaName'
    DECLARE @ObjectName varchar(255) = 'ObjectName'
    
    SELECT     o.*
    FROM       AnotherDB.sys.objects AS o
    INNER JOIN AnotherDB.sys.schemas AS s ON o.schema_id = s.schema_id
    WHERE      s.name = @SchemaName
    AND        o.name = @ObjectName
    
    推荐文章