если я хочу узнать, что ссылается на объект в SQL Server, является ли поиск системным комментарием всеобъемлющим? - PullRequest
2 голосов
/ 08 февраля 2010

Допустим, у меня есть информация в таблице, которая находится в неправильной базе данных (например, информация о клиенте в базе данных товаров). Я действительно хочу переместить эту информацию, но мне нужно выяснить, кто ее использует. Если я использую этот код для поиска имени таблицы, скажем CustomerContactNumbers, есть ли вероятность того, что что-то ускользнет? Я собираюсь игнорировать любой составной SQL, который происходит за пределами базы данных, для этого я могу выполнить текстовый поиск в системе контроля версий (плюс вы не думаете, что они заслуживают того, чтобы их код был нарушен в этом случае?). [Не мой код, я поднял его откуда-то, вероятно, здесь]:

declare @Search varchar(255) 
SET @Search='%CustomerContactNumbers%' 

SELECT DISTINCT 
    LEFT(so.name, 100) AS Object_Name, 
    "object_type"=left( 
          case so.type 
        when 'U' then 'Table - User' 
        when 'S' then 'Table - System' 
        when 'V' then 'Table - View' 
        when 'TR' then 'Trigger' 
        when 'P' then 'Stored Procedure' 
        when 'C' then 'Constraint - Check' 
        when 'D' then 'Default' 
        when 'K' then 'Key - Primary' 
        when 'F' then 'Key - Foreign' 
        when 'L' then 'Log'           
        when 'R' then 'Rule' 
        when 'RF' then 'Replication Filter stp' 
        else '<<UNKNOWN '''+so.type+'''>>' 
    end  -- case so.type 
        ,25) 
FROM syscomments sc  
    INNER JOIN sysobjects so  
        ON so.id = sc.id 
WHERE 
    text Like '%'+@Search+'%' 
ORDER BY  
    2,1 

Это покрывает это?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2010

Вы не указали, какую версию SQL Server вы используете. Я предполагаю 2000, но если вы находитесь на 2005 или позже, вы должны посмотреть на представление каталога sys.sql_modules и / или функцию OBJECT_DEFINITION () . В качестве быстрого примера:

SELECT SCHEMA_NAME(schema_id) +'.'+ name
FROM sys.objects
WHERE OBJECT_DEFINITION(object_id) LIKE '%' + @Search + '%';

-- or

SELECT OBJECT_SCHEMA_NAME(object_id) +'.'+ OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE [definition] LIKE '%' + @Search + '%';

Также вы можете проверить следующую ветку StackOverflow о новом и бесплатном инструменте поиска SQL в RedGate и некоторых альтернативных подходах:

https://stackoverflow.com/questions/2187763/what-other-products-are-similar-to-redgates-sql-search/

Если вы действительно застряли на 2000-м, то эта статья, которую я написал почти 10 лет назад, все еще может быть актуальной и полезной (в том числе с учетом проблемы порции 4K, о которой упоминал Мэтт):

http://databases.aspfaq.com/database/how-do-i-find-a-stored-procedure-containing-text.html

1 голос
/ 08 февраля 2010

Не совсем, нет, потому что syscomments разбит на 4k кусков. То есть если ссылка на объект, который вы ищете, окажется на границе 4k, то этот запрос не найдет его ни в одном фрагменте 4k. Если у вас 2005+, вы можете использовать sys.sql_modules, и это даст вам гораздо лучший ответ, но вам также нужно будет дважды проверить другие таблицы, которые могут иметь определение (например, проверить ограничения).

Другая проблема связана с объектами в других базах данных, которые ссылаются на объекты - они не будут обнаружены вашим запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...