use*_*970 2 sql sql-server-2008
以下查询列出了数据库中的所有存储过程及其定义。它返回 12 行:
USE [HQ-211-STOCK-DBO]
SELECT OBJECT_NAME (object_id) AS sp_name,
[definition] AS sp_definition
FROM [HQ-211-STOCK-DBO].sys.sql_modules as st
WHERE OBJECTPROPERTY (object_id, 'IsProcedure') = 1
Run Code Online (Sandbox Code Playgroud)
当我将查询的第一行更改为使用不同的数据库时:
USE [HQ-193-STOCK-DBO]
SELECT OBJECT_NAME (object_id) AS sp_name,
[definition] AS sp_definition
FROM [HQ-211-STOCK-DBO].sys.sql_modules as st
WHERE OBJECTPROPERTY (object_id, 'IsProcedure') = 1
Run Code Online (Sandbox Code Playgroud)
返回零行。
当我现在更改查询的第 4 行(FROM 行)时:
USE [HQ-193-STOCK-DBO]
SELECT OBJECT_NAME (object_id) AS sp_name,
[definition] AS sp_definition
FROM [HQ-193-STOCK-DBO].sys.sql_modules as st
WHERE OBJECTPROPERTY (object_id, 'IsProcedure') = 1
Run Code Online (Sandbox Code Playgroud)
我得到了一行返回。
似乎sys.sql_modules数据库名称的前缀不像我预期的那样工作。
有人可以指出我做错了什么吗?为什么在引用时不能指定数据库名称sys.sql_modules?
OBJECT_NAME()并OBJECTPROPERTY()查看当前数据库。停止使用它们。通常你不会得到匹配(这使得你的WHERE子句在第二个查询中返回 0 行 - 你可以通过返回来确认这一点object_id,然后检查当前数据库的sys.objects任何这些值),但有时你可能会得到错误的匹配,如果你object_id两个数据库中的对象恰好具有相同的对象。
(它们也忽略隔离语义,因此可以被其他查询完全阻止,即使您正在使用READ UNCOMMITTED / NOLOCK。所以即使在同一个数据库中,我强烈建议使用连接到其他目录视图而不是辅助元数据函数。通常它不是一个问题,但他们会在最不合时宜的时候被阻止,我保证。)
相反,你可以说:
SELECT o.name AS sp_name, st.[definition] AS sp_definition
FROM [HQ-211-STOCK-DBO].sys.sql_modules as st
INNER JOIN [HQ-211-STOCK-DBO].sys.objects AS o
ON st.[object_id] = o.[object_id]
WHERE o.type = 'P';
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1719 次 |
| 最近记录: |