gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:21:02 24 4
gpt4 key购买 nike

示例:

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 之类的函数的语言等等:

The Microsoft SQL Server 2005 Database Engine assumes that object_id is in the context of the current database. A query that references an object_id in another database returns NULL or incorrect results.

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

  1. 我无法在 SP 内使用其他数据库

  2. 我无法在其他数据库或主数据库(或除我自己的数据库之外的任何其他数据库)中创建代理 UDF stub (或更改任何内容)来帮助我解决问题。

那么我怎样才能从 OBJECT_ID('AnotherDB.ASchema.ATable') 获取数据库呢?当我在 ThisDB 中时?

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

最佳答案

你应该能够做到这一点:

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 而不是元数据函数。

关于sql-server - 另一个数据库中对象的 OBJECT_ID - 如何查找数据库 ID 或名称/完全限定的对象名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1843121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com