Как мне получить таблицы, на которые ссылаются в функции с табличным значением?

#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]