sql >> Database >  >> RDS >> Sqlserver

sp_MSForEachDB Ongeldig gebruik van nevenwerkingsoperator binnen functie

U kunt dit niet dynamisch doen (zoals in zonder alle databasenamen vooraf hard te coderen) zonder dynamische SQL, en u kunt dynamische SQL niet in een functie gebruiken. Je mag in geen geval sp_MSForEachDB gebruiken of, IMHO, met INFORMATION_SCHEMA .

Schrijf een opgeslagen procedure die de resultatenset retourneert. Als je de uitvoer absoluut met andere dingen wilt samenvoegen (waarom codeer je dat niet in de opgeslagen procedure?), voeg dan de uitvoer in een #temp-tabel in.

Probeer dit:

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

Gebruik:

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. Wat betekent tekenset en sortering precies?

  2. Trigger gebaseerd op sysdate

  3. Kolom wijzigen van Null naar Niet Null in SQL Server-tabel - SQL Server / T-SQL-zelfstudie, deel 52

  4. Oracle krijgt DISTINCT numeriek met een CLOB in de query