sql >> データベース >  >> RDS >> Sqlserver

スキーマに関係なく、「mytable」という名前のテーブルを持つ sysobjects 内のすべてのデータベースを選択しますか?

    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;
      

    1. PostgreSQLデータベースのすべてのテーブルを削除するにはどうすればよいですか?

    2. Rails 5 form_forwithcheckbox配列

    3. $ _GETを使用して、PHPで同じ名前を使用して複数のパラメーターを取得する方法

    4. エラー2068(HY000):アクセス制限のためにLOAD DATALOCALINFILEファイル要求が拒否されました