Как искать значение в SQL во всех таблицах базы данных, используя временную хранимую процедуру? - PullRequest
1 голос
/ 10 июня 2019

У меня есть несколько баз данных, и я хочу создать временную хранимую процедуру (##SearchAllTables), которая ищет значение во всех таблицах базы данных.

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

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

Я использую хранимую процедуру с этого сайта: https://thesitedoctor.co.uk/blog/search-every-table-and-field-in-a-sql-server-database-updated/

Вы знаете, почему у меня такое поведение?

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это ОЧЕНЬ интенсивное задание, которое вы просите сделать.Я бы не рекомендовал работать в производственной среде.

Код, на который вы ссылаетесь, предназначен только для запроса таблиц в текущей базе данных.

INFORMATION_SCHEMA.TABLES :

Возвращает одну строку для каждой таблицы или представления в текущей базе данных, для которых у текущего пользователя есть разрешения.

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

DECLARE @dbName  NVARCHAR(256)

DECLARE db_cursor CURSOR FOR
SELECT name
FROM sys.databases
WHERE state_desc = 'ONLINE'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbName

WHILE @@FETCH_STATUS = 0
BEGIN
    --Code from proc here
END

Затем вам нужно изменить запрос, объединяющий переменную @TableName, для включения имени базы данных:

...

BEGIN
    SET @ColumnName = ''
    SET @TableName = 
    (
        SELECT QUOTENAME(@dbName)+ '.' + MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM     INFORMATION_SCHEMA.TABLES
        WHERE         TABLE_TYPE = 'BASE TABLE'
            AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
            AND    OBJECTPROPERTY(
                    OBJECT_ID(
                        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                         ), 'IsMSShipped'
                           ) = 0
    )

    WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)

 ...
0 голосов
/ 10 июня 2019

Глядя на хранимую процедуру, кажется, что этот фильтр в строке 33 кода процедуры является проблемой при применении к базе данных master:

OBJECTPROPERTY(
    OBJECT_ID(
        QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
        ), 'IsMSShipped'
            ) = 0

Все таблицы в базе данных master поставляются с установкой MS SQL, поэтому свойство IsMSShipped будет равно 1 и, следовательно, будет исключено из поиска. Вы можете проверить это, запустив:

select
    *,
    OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped')
from
    master.INFORMATION_SCHEMA.TABLES

Если вы хотите выполнить поиск в этих таблицах, удалите этот фильтр из предложения WHERE.

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