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

sp_MSForEachDB関数内での副作用演算子の無効な使用

    動的SQLがないと、これを動的に(すべてのデータベース名を事前にハードコーディングしない場合のように)行うことはできません。また、関数で動的SQLを使用することもできません。 どのような場合でもsp_MSForEachDBを使用しないでください または、IMHO、INFORMATION_SCHEMAの使用

    結果セットを返すストアドプロシージャを記述します。出力を他のものに結合する必要がある場合(ストアドプロシージャにコーディングしないのはなぜですか?)、出力を#tempテーブルに挿入します。

    これを試してください:

    CREATE PROCEDURE dbo.AllMyColumnsEverywhereForReals
    AS
    BEGIN
      SET NOCOUNT ON;
    
      DECLARE @sql NVARCHAR(MAX) = N'';
    
      SELECT @sql += '
      UNION ALL SELECT 
          [database]  = N''' + d.name + ''' COLLATE SQL_Latin1_General_CP1_CI_AI,
          [schema]    = s.name COLLATE SQL_Latin1_General_CP1_CI_AI,
          [object]    = o.name COLLATE SQL_Latin1_General_CP1_CI_AI,
          [column]    = c.name COLLATE SQL_Latin1_General_CP1_CI_AI,
          [qualified] = QUOTENAME(''' + d.name + ''') 
            + ''.'' + QUOTENAME(s.name) 
            + ''.'' + QUOTENAME(c.name) COLLATE SQL_Latin1_General_CP1_CI_AS,
          [type] = CASE o.type WHEN ''U'' THEN ''Table'' ELSE ''View'' END
        FROM ' + QUOTENAME(d.name) + '.sys.columns AS c
          INNER JOIN ' + QUOTENAME(d.name) + '.sys.objects AS o
          ON c.[object_id] = o.[object_id]
          INNER JOIN ' + QUOTENAME(d.name) + '.sys.schemas AS s
          ON o.[schema_id] = s.[schema_id]
          WHERE o.type IN (''U'', ''V'')'
      FROM sys.databases AS d WHERE [state] = 0 AND name NOT IN 
        (N'master',N'tempdb',N'msdb',N'model',N'ReportServer',N'ReportServerTempDB');
    
      SET @sql = STUFF(@sql, 1, 13, '');
    
      EXEC sp_executesql @sql;
    END
    GO
    

    使用法:

    CREATE TABLE #x
    (
      db     SYSNAME, 
      sch    SYSNAME, 
      obj    SYSNAME, 
      col    SYSNAME, 
      qual   NVARCHAR(390),
      [type] CHAR(5)
    );
    
    INSERT #x EXEC dbo.AllMyColumnsEverywhereForReals;
    
    SELECT cols FROM #x AS x -- INNER JOIN something else ON x.whatever...
    



    1. Laravel.envファイルの環境固有のSSL構成

    2. mysqli(データベース)接続を閉じる必要があるのはいつですか?

    3. Androidルームライブラリがアセットからデータベースをコピーできません

    4. Windows認証でSQLServerにログインできません