SQL Server: как найти неиспользуемые поля в поле зрения - PullRequest
2 голосов
/ 10 ноября 2010

Есть ли способ идентифицировать поля в представлении, на которые ссылаются другие объекты в базе данных (например, procs, UDF, другие представления)?

У меня есть около 50 представлений, которые в качестве своих базовых данных ссылаются на внешнюю БД. Локальные представления в основном 'SELECT *' из таблиц внешних БД.

Мы меняем внешнюю БД, и нам нужно выяснить, какие поля фактически используются приложением, которое использует представления, чтобы мы могли настроить новую внешнюю БД так, чтобы она содержала только те поля, которые нам нужны.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 ноября 2010

Использование:

SELECT OBJECT_NAME(m.object_id), m.*
  FROM SYS.SQL_MODULES m
 WHERE m.definition like N'%my_view_name%'

Это позволит вам искать ссылки на представления, включая ссылки на конкретные столбцы.

Фон:

SYSCOMMENTS, INFORMATION_SCHEMA.VIEWS и INFORMATION_SCHEMA.routines имеют столбцы NVARCHAR (4000), в то время как SYS.SQL_MODULES столбец определения равен NVARCHAR (MAX).Так что, если «myViewName» используется в позиции 3998, он не будет найден.SYSCOMMENTS имеет несколько строк, но ROUTINES усекает.

1 голос
/ 10 ноября 2010

ОБНОВЛЕНИЕ

Как указывает OMG Poines при поиске определения, вы хотите использовать вместо него модули

Возможно, вам все еще нужны столбцы, поэтому вы захотите присоединить их к таблице sys.columns

SELECT OBJECT_NAME(m.object_id), c.*
  FROM SYS.SQL_MODULES m
        INNER JOIN sys.columns c
        ON m.object_id = c.object_Id
 WHERE m.definition like N'%externalDB%'

Для бедных душ Не , использующих 2005 или более позднюю версию, вы все еще можете использовать ниже.

Для поиска представлений с ограничением в 4000 символов

SELECT * 
FROM INFORMATION_SCHEMA.VIEWS
where 
VIEW_DEFINITION like '%externalDB%'

и если вам нужны столбцы из этих представлений, вы можете сделать следующее

select c.* from 

information_schema.VIEWS vw
INNER JOIN information_schema.COLUMNS c
ON vw.Table_catalog = c.Table_catalog
and vw.TABLE_SCHEMA= c.TABLE_SCHEMA
and vw.TABLE_NAME= c.TABLE_NAME

where 
VIEW_DEFINITION like '%externalDB%'

Однако, конечно, если эти представления ссылаются на локальные таблицы, вы также получите эти столбцы

Примечание : Возможно, вы захотите использовать SYSCOMMENTS вместо подпрограмм, но если ваша строка поиска ищет что-то, кратное 4000, вы все равно столкнетесь с проблемами, так что это неполный ответ для тех в SQL 2000

0 голосов
/ 10 ноября 2010

Если вы щелкнете правой кнопкой мыши по представлению в Management Studio, вы можете выбрать «Просмотр зависимостей». Здесь должны отображаться все другие объекты (сохраненные процедуры, пользовательские функции, другие представления), которые зависят от выбранного представления.

Затем вам придется просмотреть каждое из них и посмотреть, какие поля оно на самом деле использует, к сожалению.

Пока у вас нет динамического SQL, который вызывает представление непосредственно из приложения, это должно помочь.

...