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

Я новичок здесь. У меня есть много баз данных в моей SSMS, поэтому мне нужно найти имя базы данных, используя заданное имя таблицы, используя хранимые процедуры. И я не очень хорош в написании SP и обработке ошибок. Я прошу прощения за мой английский.

Спасибо

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

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вы можете создать хранимую процедуру следующим образом:

CREATE PROCEDURE sp_Get_Tables
    @schema VARCHAR(50) = 'dbo',
    @table_name VARCHAR(100) = 'Default_Table_Name'
AS
SELECT name 
FROM sys.databases 
WHERE CASE WHEN state_desc = 'ONLINE' THEN OBJECT_ID(QUOTENAME(name) + '.' + @schema + '.' + @table_name, 'U') END IS NOT NULL

И выполнить хранимую процедуру вы можете в следующем:

EXEC sp_Get_Names 'Schema', 'Table_Name'
0 голосов
/ 23 мая 2019

Попробуйте:

Create PROCEDURE Pro_FindTable
(@tableName VARCHAR(MAX))
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @name VARCHAR(MAX),
            @dbid INT;
    DECLARE C CURSOR FAST_FORWARD FOR(
    SELECT name,
           database_id
    FROM sys.databases);
    OPEN C;
    FETCH NEXT FROM C
    INTO @name,
         @dbid;
    WHILE @@FETCH_STATUS = 0
    BEGIN

        DECLARE @query NVARCHAR(MAX)
            = 'IF EXISTS(SELECT name FROM(SELECT name, COUNT(*)Over(Order By (Select Null)) as RN FROM(SELECT '''
              + @name + ''' AS name UNION ALL SELECT name FROM [' + @name
              + '].sys.tables WHERE type=''U'' AND name = ''' + @tableName
              + ''') as K)as K Where RN>1)
              Select '''+ @name + '''';

        EXEC (@query);

        FETCH NEXT FROM C
        INTO @name,
             @dbid;

    END;
    CLOSE C;
    DEALLOCATE C;

END;

И назовите это так:

EXEC Pro_FindTable 'MyTable'

Результатом будут все базы данных, в которых есть таблица с именем «MyTable»

...