изберете всички бази данни в sysobjects, които имат таблица с име „mytable“, независимо от схемата?

За даден sql 2000 - 2008 сървър искам да намеря всяка таблица с име dbo.[MyTable] на този сървър. В допълнение, как да намеря всички бази данни, които имат таблица с име [dbo].[MyTable] и [AnySchemaName].[MyTable]. Има ли проста команда sp_ като spTables MyTable? Или „sp_AllDatabaseTable [MyTable]“?

Искам да го отпечатам като:

ServerName  Database  SchemaName  MyTable   Date Created
----------- --------- ----------- --------- -------------

Мерси


person RetroCoder    schedule 02.12.2011    source източник
comment
Също така, в sQL Server 2005 и по-нови, трябва да спрете да използвате sysobjects, тъй като е отхвърлен - вместо това използвайте изгледите от схемата sys, напр. SELECT name FROM sys.tables ... и така нататък   -  person marc_s    schedule 03.12.2011


Отговори (4)


Разбира се, можете да използвате sp_msforeachdb за тази цел, но трябва да запомните, че тази функция не е нито документирана, нито се поддържа официално. Освен това понякога се чупи. Повече за това тук Създаване на по-надежден и гъвкав sp_MSforeachdb

Можете да използвате този скрипт за търсене на таблица по име във всички бази данни. Взех го от Намиране на таблица във всяка база данни на SQL сървър

DECLARE @TableName VARCHAR(256)
SET @TableName='YOUR_TABLE_NAME'
DECLARE @DBName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getDBName CURSOR
SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
CREATE TABLE #TmpTable (DBName VARCHAR(256),
SchemaName VARCHAR(256),
TableName VARCHAR(256),
create_date date, modify_date date)
OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'USE ' + @DBName + ';
INSERT INTO #TmpTable
SELECT '''+ @DBName + ''' AS DBName,
SCHEMA_NAME(schema_id) AS SchemaName,
name AS TableName,
create_date, modify_date
FROM sys.tables
WHERE name LIKE ''%' + @TableName + '%''' --WHERE name = '' + @TableName + ''' /* if you want to search by exact table name*/ 
EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName
SELECT *
FROM #TmpTable
DROP TABLE #TmpTable

Освен това може да искате да прочетете това Намиране на име на таблица във всички обекти на всички бази данни

person Igor Borisenko    schedule 04.12.2011

Наистина бих предпочел решение, което не използва нито CURSORS, нито sp_msforeachdb.

Решението по-долу ви дава идея и можете да я адаптирате към собствените си нужди.

USE [master]
GO


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


BEGIN TRY



SET NOCOUNT ON
SET DATEFORMAT DMY
SET DEADLOCK_PRIORITY NORMAL;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

DECLARE  @log NVARCHAR(MAX)
        ,@vCrlf CHAR(2);

SELECT  @log = ''
       ,@vCrlf = CHAR(13)+CHAR(10);


DECLARE @SQL NVARCHAR(MAX)

BEGIN TRY DROP TABLE #OBJECTS END TRY BEGIN CATCH END CATCH
CREATE TABLE #OBJECTS(
DB_ID INT,
OBJECT_ID INT,
S_NAME SYSNAME,
NAME SYSNAME,
ROW_COUNT INT,
STATISTICS_UPDATED DATETIME)




SELECT @SQL = '

SELECT db_id=db_id(),
       o.object_id,
       s_name=s.name,
       o.name,
       ddps.row_count 
       ,[Statistics_Updated]=STATS_DATE(I.OBJECT_ID,I.INDEX_ID)
FROM sys.indexes AS i
  INNER JOIN sys.objects AS o ON i.OBJECT_ID = o.OBJECT_ID
  INNER JOIN sys.schemas s ON s.schema_id = o.schema_id
  INNER JOIN sys.dm_db_partition_stats AS ddps ON i.OBJECT_ID = ddps.OBJECT_ID
  AND i.index_id = ddps.index_id 
WHERE i.index_id < 2  
 AND o.is_ms_shipped = 0

 '


set @SQL = (
            SELECT STUFF(
  (SELECT N'  ' + ' USE ' + QUOTENAME(name) +';' + @vCrlf + @SQL + @vCrlf    
                                FROM SYS.DATABASES SD
                                WHERE SD.STATE_DESC = 'ONLINE' -->Skips the database if it is not online
                                  AND SD.COMPATIBILITY_LEVEL > 80  
                                  AND SD.database_id > 3 -- NO MASTER NOR TEMPDB NOR MODEL
                        FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'')
)






INSERT INTO #OBJECTS
(   [db_id],
    [object_id],
    [s_name],
    [name],
    [row_count],
    [Statistics_Updated]
)
EXECUTE MASTER.DBO.sp_executesql @SQL

SELECT * FROM #OBJECTS
--WHERE NAME = 'THE NAME THAT I AM LOOKING FOR'

END TRY
BEGIN CATCH

        PRINT '--EXCEPTION WAS CAUGHT--' + CHAR(13) +
              'THE ERROR NUMBER:' + COALESCE(CAST ( ERROR_NUMBER()  AS VARCHAR), 'NO INFO') + CHAR(13) 

        PRINT 'SEVERITY: '        + COALESCE(CAST ( ERROR_SEVERITY()  AS VARCHAR), 'NO INFO') + CHAR(13) +
              'STATE: '           + COALESCE(CAST ( ERROR_STATE() AS VARCHAR), 'NO INFO')  + CHAR(13) 

        PRINT 'PROCEDURE: '       + COALESCE(CAST ( COALESCE(ERROR_PROCEDURE(),'NO INFO')  AS VARCHAR), 'NO INFO') + CHAR(13) +
              'LINE NUMBER: '     + COALESCE(CAST ( ERROR_LINE() AS VARCHAR), 'NO INFO')  + CHAR(13) 

        PRINT 'ERROR MESSAGE: '
        PRINT  CAST ( COALESCE(ERROR_MESSAGE(),'NO INFO')   AS NTEXT)

END CATCH;
person Marcello Miorelli    schedule 02.12.2014

Предпочитам подход, базиран на набор:

Declare @TableName as Varchar(255)
Set @TableName = '<MyTableName>'

Declare @SQL as Varchar(max)
Select @SQL = Coalesce(@SQL + '
', '') + 
CASE 
WHEN Row_Number() Over (Order by Database_ID) = 1 
THEN '' 
ELSE 
'UNION ALL ' 
END +
'SELECT 
  ''' + d.Name + '''    as DatabaseName
, s.Name                as SchemaName 
, o.Name                as TableName 
FROM ' + d.Name +'.Sys.Objects o 
INNER JOIN ' + d.Name + '.Sys.Schemas s
ON o.Schema_ID = s.Schema_ID
WHERE o.Name like ''' + @TableName + ''''
FROM sys.databases d
where d.Name not like 'ReportServer%'
and d.Name not like 'SSISPackageRegistry'

Print @SQL 
EXEC(@SQL)
person Karl Haberl    schedule 12.05.2015
comment

Опитайте StyleCI, той поддържа PHP, JavaScript, CSS, Typescript, Less, SCSS и Vue.js.

Можете също да конфигурирате StyleCI според вашите стандарти за кодиране и той може автоматично да коригира вашия код. Използваме го в куп проекти.

- person dbf; 13.05.2015

Бих казал

sp_msforeachdb 'Select * from Sysobjects where name=''MyTable'''

Но не е нужно, sysobjects е в главната таблица и така или иначе го прави за всички бази данни.

Трябва да можете да намерите другите колони достатъчно лесно.

person Stephen Turner    schedule 02.12.2011