2

次のクエリは、データベース内のすべてのストアド プロシージャをその定義と共に一覧表示します。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

別のデータベースを使用するようにクエリの最初の行を変更すると、次のようになります。

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

ゼロ行が返されました。

クエリの 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

1行返されます。

データベース名のプレフィックスsys.sql_modulesが期待どおりに機能しないようです。

誰かが私が間違っていることを指摘できますか? を参照するときにデータベース名を指定できないのはなぜsys.sql_modulesですか?

4

1 に答える 1

5

OBJECT_NAME()OBJECTPROPERTY()現在のデータベースを見てください。それらの使用を停止します。通常、一致は得られません (これにより、WHERE句は 2 番目のクエリで 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';
于 2013-10-24T15:18:33.643 に答える