Object_id用法

在sysobjects系统表中存储着数据库的所有对象,每个对象都有一个唯一的id号进行标识.
object_id就是根据对象名称返回该对象的id.
反之,object_name是根据对象id返回对象名称.

select object_id(对象名)等同于:
select id from sysobjects where name=对象名
注: 如果参数是一个临时表名,则必须指定所属数据库.你举出的OBJECT_ID('Tempdb..##flowcount') 就属于这种情况.说明这个临时表是数据库Tempdb的.

select object_name(id号)等同于:
select name from sysobjects where id=id号


转载于:https://www.cnblogs.com/lip-blog/p/7384797.html

<think>我们正在处理一个数据库查询转换问题:将Oracle中用于选择不同存储过程的查询转换为SQL Server的等效查询。 根据用户需求,我们需要将Oracle特定的语法转换为SQL Server语法。 在Oracle中,我们可能使用`dbms_bits.or`这样的过程,但SQL Server中没有直接对应的函数。因此,我们需要寻找替代方法。 然而,用户的问题是关于“选择不同的存储过程”的转换。注意,用户的问题描述中提到了“select distinct procedures”,即选择不同的存储过程。 在Oracle中,我们可能需要查询系统表(或系统视图)来获取存储过程的信息。 在Oracle中,我们可以查询`ALL_PROCEDURES`或`DBA_PROCEDURES`等视图。而在SQL Server中,我们可以查询`sys.procedures`系统视图。 但是,用户的问题中并没有给出具体的Oracle查询语句,所以我们只能根据一般情况来推断。 假设在Oracle中,我们可能有如下查询来获取不同的存储过程名: ```sql SELECT DISTINCT object_name FROM all_procedures WHERE owner = 'SCHEMA_NAME'; ``` 或者,如果我们想根据某些条件选择不同的存储过程,可能包括存储过程的名称或其他属性。 在SQL Server中,我们可以使用以下查询来获取不同的存储过程名称: ```sql SELECT DISTINCT name FROM sys.procedures; ``` 但是,请注意,在SQL Server中,存储过程是按模式(schema)组织的。因此,如果我们想包含模式名,可以这样: ```sql SELECT DISTINCT schema_name(schema_id) AS schema_name, name AS procedure_name FROM sys.procedures; ``` 如果用户的问题是关于如何转换一个特定的查询,我们需要知道具体的Oracle查询语句。但用户没有提供,所以我们只能给出一般性的转换方法。 另外,用户提供的引用中提到了`dbms_bits.or`,这是一个Oracle特定的位操作函数。在SQL Server中,我们可以使用按位或运算符`|`,或者使用内置函数,但具体取决于上下文。然而,用户的问题是关于存储过程的,所以这个引用可能不是直接相关的。 因此,我们主要关注如何查询存储过程列表。 总结转换步骤: 1. 确定Oracle查询中使用的系统视图(如`ALL_PROCEDURES`、`USER_PROCEDURES`等)。 2. 在SQL Server中找到对应的系统视图(如`sys.procedures`)。 3. 将Oracle中的列名映射到SQL Server中的列名。 - 例如,`object_name`在Oracle中可能对应SQL Server中的`name`。 4. 注意模式(schema)的处理:Oracle中通过`owner`列指定,而SQL Server中通过`schema_id`关联,我们可以使用`schema_name()`函数获取模式名。 如果用户的具体查询涉及其他条件,则需要具体分析。 由于用户没有提供具体的Oracle查询语句,我们只能提供一般性的转换示例。 示例转换: Oracle查询(获取所有存储过程的名称,去重): ```sql SELECT DISTINCT object_name FROM all_procedures; ``` 转换为SQL Server: ```sql SELECT DISTINCT name FROM sys.procedures; ``` 如果Oracle查询中指定了所有者(模式): ```sql SELECT DISTINCT object_name FROM all_procedures WHERE owner = 'MYSCHEMA'; ``` 在SQL Server中,我们可以这样写: ```sql SELECT DISTINCT name FROM sys.procedures WHERE schema_name(schema_id) = 'dbo'; -- 假设模式名为'dbo' ``` 注意:在SQL Server中,默认的模式通常是'dbo',但也可以是其他模式。 如果用户需要更复杂的信息(如参数等),则可能需要连接其他系统视图(如`sys.parameters`)。 由于用户的问题是关于“选择不同的存储过程”,我们假设只需要存储过程的名称(可能包括模式)即可。 因此,我们给出上述转换方法。 如果用户有具体的Oracle查询,请提供以便更精确的转换。 相关问题: 1. 在SQL Server中如何列出所有存储过程及其参数? 2. 如何将Oracle的系统表查询(如`ALL_TABLES`)转换为SQL Server的等效查询? 3. SQL Server和Oracle在存储过程元数据管理上有哪些主要区别?</think>要将 Oracle 中查询存储过程的语句转换为 SQL Server 等效语句,关键在于理解两者系统视图的差异。以下是转换方法及示例: ### 1. **基础转换(查询存储过程列表)** - **Oracle 语法**(查询所有存储过程): ```sql SELECT DISTINCT object_name FROM all_procedures WHERE object_type = 'PROCEDURE'; ``` - **SQL Server 等效语法**: ```sql SELECT DISTINCT name FROM sys.procedures WHERE type = 'P'; -- 'P' 表示存储过程 ``` ### 2. **包含模式(Schema)信息的转换** - **Oracle 语法**(含模式名): ```sql SELECT DISTINCT owner, object_name FROM all_procedures WHERE object_type = 'PROCEDURE'; ``` - **SQL Server 等效语法**: ```sql SELECT DISTINCT SCHEMA_NAME(schema_id) AS schema_name, name AS procedure_name FROM sys.procedures WHERE type = 'P'; ``` ### 3. **过滤特定存储过程** - **Oracle 语法**(按名称过滤): ```sql SELECT DISTINCT object_name FROM all_procedures WHERE object_name LIKE 'GET%'; ``` - **SQL Server 等效语法**: ```sql SELECT DISTINCT name FROM sys.procedures WHERE type = 'P' AND name LIKE 'GET%'; ``` ### 4. **关键差异说明** | **组件** | **Oracle** | **SQL Server** | |----------------|--------------------------|------------------------| | **系统视图** | `ALL_PROCEDURES` | `sys.procedures` | | **对象类型** | `object_type = 'PROCEDURE'` | `type = 'P'` | | **模式名** | `OWNER` 列 | `SCHEMA_NAME(schema_id)` 函数 | ### 注意事项 - SQL Server 使用 `sys` 系统目录视图,而 Oracle 使用 `ALL_*` 或 `DBA_*` 视图[^1]。 - 若需查询存储过程**内容**(如定义文本),在 SQL Server 中使用 `OBJECT_DEFINITION(object_id)` 函数替代 Oracle 的 `DBMS_METADATA.GET_DDL`。 ### 完整转换示例 假设需要查询 `HR` 模式下以 `CALC_` 开头的存储过程: ```sql -- Oracle 原语句 SELECT DISTINCT object_name FROM all_procedures WHERE owner = 'HR' AND object_name LIKE 'CALC_%'; -- SQL Server 等效 SELECT DISTINCT name FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = 'HR' AND name LIKE 'CALC_%' AND type = 'P'; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值