sql >> Databáze >  >> RDS >> Sqlserver

sp_MSForEachDB Neplatné použití operátoru s vedlejším účinkem v rámci funkce

Nemůžete to udělat dynamicky (jako bez pevného kódování všech názvů databází předem) bez dynamického SQL a nemůžete použít dynamické SQL ve funkci. v žádném případě byste neměli používat sp_MSForEachDB nebo, IMHO, pomocí INFORMAČNÍHO SCHÉMATU .

Napište uloženou proceduru, která vrátí sadu výsledků. Pokud nutně potřebujete připojit výstup k jiným věcem (proč to nezakódovat do uložené procedury?), vložte výstup do tabulky #temp.

Zkuste toto:

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

Použití:

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. Výběrový dotaz s limitem posunu je příliš pomalý

  2. 'fetch' v CHOP získá pouze jeden výsledek

  3. Jak ladit postgresql uložené procedury?

  4. Jak zkopíruji databázi SQL Azure na svůj místní vývojový server?