如何使用存储过程从给定的表名中查找数据库的名称?

时间:2019-05-23 11:21:57

标签: sql-server tsql stored-procedures sql-server-2012 cursors

我是新手。我的SSMS中有许多数据库,因此我需要使用存储过程使用给定的表名来查找数据库名。 而且我也不擅长编写SP和处理错误。 我为我的英语道歉。

谢谢

我在存储过程中使用游标进行了尝试。 但是我遇到了错误,因为我不善于处理错误。

2 个答案:

答案 0 :(得分:1)

您可以在下面创建存储过程:

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'

答案 1 :(得分:0)

尝试一下:

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”的表的数据库