Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

sp_MSForEachDB Nieprawidłowe użycie operatora powodującego skutki uboczne w ramach funkcji

Nie możesz tego zrobić dynamicznie (na przykład bez wcześniejszego zakodowania wszystkich nazw baz danych) bez dynamicznego SQL i nie możesz użyć dynamicznego SQL w funkcji. w żadnym wypadku nie powinieneś używać sp_MSForEachDB lub, IMHO, używając INFORMATION_SCHEMA .

Napisz procedurę składowaną, która zwraca zestaw wyników. Jeśli koniecznie musisz połączyć wyjście z innymi rzeczami (dlaczego nie zakodować tego w procedurze składowanej?), wstaw wyjście do tabeli #temp.

Spróbuj tego:

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

Użycie:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSMS wersja 18 – brak diagramów bazy danych

  2. SQL - Zapytanie o adres IP serwera

  3. SQL Server ARITHABORT

  4. Warunki wyścigu kolejki procesów SQL Server

  5. Jak ograniczyć niezalogowanym/nieautoryzowanym użytkownikom możliwość przeglądania stron internetowych w ASP.NET?