#sql #sql-server #tsql
Вопрос:
Мне нужно что-то подобное, но вместо вывода хранимых процедур и таблиц, на которые они ссылаются, функция SQL Server с табличным значением и таблицы, на которые они ссылаются. Спасибо всем.
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp (
[DB Name] VARCHAR(MAX),
[Stored Procedure] VARCHAR(MAX),
[Schema] VARCHAR(MAX),
[Table] VARCHAR(MAX)
)
EXEC sp_msforeachdb 'USE [?]; INSERT INTO #temp
SELECT DISTINCT ''?'',
sp.Name [Stored Procedure],
''['' spsch.name '']'' [Schema],
''['' o.Name '']'' [Table]
FROM sys.objects o WITH (NOLOCK)
INNER JOIN sys.sql_expression_dependencies sd WITH (NOLOCK) ON o.object_id = sd.referenced_id
INNER JOIN sys.objects sp WITH (NOLOCK) ON sd.referencing_id = sp.object_id
INNER JOIN sys.schemas spsch WITH (NOLOCK) ON sp.schema_id = spsch.schema_id
AND sp.type IN (''P'')
ORDER BY [Stored Procedure],
[Table]
'
SELECT *
FROM #temp a
ORDER BY [DB NAME],
[STORED PROCEDURE],
[TABLE]
Комментарии:
1. Перестаньте разбрызгивать свой код с помощью nolock .
2. @SMor
nolock
довольно стандартен для запросов DMV (системных таблиц), чтобы предотвратить неприятные цепочки блокировок по всей базе данных, вероятно, единственный раз, когда вам следует его использовать.
Ответ №1:
Это очень просто. Просто измените букву » Р «в предложении» В » на «FN». Смотреть ниже:
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
CREATE TABLE #temp (
[DB Name] VARCHAR(MAX),
[Stored Procedure] VARCHAR(MAX),
[Schema] VARCHAR(MAX),
[Table] VARCHAR(MAX)
)
EXEC sp_msforeachdb 'USE [?]; INSERT INTO #temp
SELECT DISTINCT ''?'',
sp.Name [Stored Procedure],
''['' spsch.name '']'' [Schema],
''['' o.Name '']'' [Table]
FROM sys.objects o WITH (NOLOCK)
INNER JOIN sys.sql_expression_dependencies sd WITH (NOLOCK) ON o.object_id = sd.referenced_id
INNER JOIN sys.objects sp WITH (NOLOCK) ON sd.referencing_id = sp.object_id
INNER JOIN sys.schemas spsch WITH (NOLOCK) ON sp.schema_id = spsch.schema_id
AND sp.type IN (''FN'')
ORDER BY [Stored Procedure],
[Table]
'
SELECT *
FROM #temp a
ORDER BY [DB NAME],
[STORED PROCEDURE],
[TABLE]