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

Sql server 如何使用存储过程从给定的表名中查找数据库名?,sql-server,tsql,stored-procedures,sql-server-2012,cursors,Sql Server,Tsql,Stored Procedures,Sql Server 2012,Cursors,我是这里的新手。我的SSMS中有许多数据库,因此我需要使用存储过程使用给定的表名查找数据库名。 我不擅长写SP和处理错误。 我为我的英语道歉 多谢各位 我尝试在存储过程中使用游标。 但是,由于我不善于处理错误,所以我会出现错误。您可以通过以下方式创建存储过程: CREATE PROCEDURE sp_Get_Tables @schema VARCHAR(50) = 'dbo', @table_name VARCHAR(100) = 'Default_Table_Name' AS

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

多谢各位

我尝试在存储过程中使用游标。
但是,由于我不善于处理错误,所以我会出现错误。

您可以通过以下方式创建存储过程:

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'
并执行存储过程,您可以执行以下操作:

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'
试试这个:

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