Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

sp_MSForEachDB Sử dụng Không hợp lệ Toán tử Hiệu quả Bên trong Chức năng

Bạn không thể thực hiện điều này một cách động (như trong không có mã hóa cứng trước tất cả các tên cơ sở dữ liệu) mà không có SQL động và bạn không thể sử dụng SQL động trong một hàm. Bạn không nên sử dụng sp_MSForEachDB trong mọi trường hợp hoặc IMHO, sử dụng INFORMATION_SCHEMA .

Viết một thủ tục được lưu trữ trả về tập kết quả. Nếu bạn thực sự cần kết hợp đầu ra với nội dung khác (tại sao không viết mã đó vào thủ tục được lưu trữ?), Thì hãy chèn đầu ra vào bảng #temp.

Hãy thử điều này:

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

Cách sử dụng:

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. Varchar (-1) có nghĩa là gì?

  2. Cách trả về một chuỗi theo thứ tự ngược bằng SQL Server - REVERSE ()

  3. T-Sql dường như đang đánh giá câu lệnh If ngay cả khi điều kiện không đúng

  4. Các chỉ mục của SQL Server:Các yêu cầu chính, tác động đến hiệu suất và những cân nhắc

  5. SQL - Làm cách nào để truy vấn các trường hợp đăng ký lại trong TSQL?