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

Con trỏ máy chủ SQL - lặp qua nhiều máy chủ và thực thi truy vấn

DECLARE @SN VARCHAR(20);

DECLARE C CURSOR LOCAL FAST_FORWARD
  FOR SELECT DISTINCT(SERVERNAME) FROM TABLE 
  where SERVERNAME NOT IN ('SRV1','SRV2','SRV3');

OPEN C;

FETCH NEXT FROM C INTO @SN;
WHILE (@@FETCH_STATUS = 0)
BEGIN 
    PRINT @SN;
    -- you could loop here for each database, if you'd define what that is
    SET @sql = N'SELECT * FROM ' + @SN + '.master.dbo.TABLE;';
    EXEC sys.sp_executesql @sql;
    FETCH NEXT FROM C INTO @SN;
END 
CLOSE C;
DEALLOCATE C;

Các thay đổi:

  1. Không có lý do gì để sử dụng các tùy chọn con trỏ mặc định ở đây - toàn cầu, có thể cập nhật, động, có thể cuộn, v.v. Nền .

  2. Theo thói quen / phương pháp hay nhất, hãy sử dụng sp_executesql chứ không phải EXEC() . Mặc dù nó không thực sự quan trọng trong trường hợp này, nhưng nó có thể quan trọng ở những người khác, vì vậy tôi muốn luôn viết mã theo cùng một cách. Nền .

  3. Ngoài ra, hãy tập thói quen kết thúc các câu lệnh của bạn bằng dấu chấm phẩy. Cuối cùng thì bạn sẽ phải làm vậy. Bối cảnh .

CHỈNH SỬA

Bây giờ chúng tôi có thêm một chút thông tin về các yêu cầu thực tế của bạn, tôi đề xuất đoạn mã này. Ồ, và nhìn này, không có con trỏ (tốt, không có rõ ràng khai báo con trỏ và tất cả các giàn giáo đi kèm với chúng)!

SET NOCOUNT ON;

DECLARE @dbs TABLE(SERVERNAME SYSNAME, DBNAME SYSNAME);

DECLARE @sql NVARCHAR(MAX) = N'';

-- first, let's get the databases on each server:

SELECT @sql += N'SELECT ''' + SERVERNAME + ''', name FROM '
 + QUOTENAME(SERVERNAME) + '.master.sys.databases
   WHERE database_id > 4 
   AND name NOT IN (N''somedb'',N''someotherdb'');' 
 FROM dbo.INSTALLATION 
   WHERE DATABASETYPE = 'MsSql' 
   AND SERVERNAME IN ('x');

INSERT @dbs EXEC sys.sp_executesql @sql;

SELECT @sql = N'';

-- now, build a command to run in each database context:

SELECT @sql += N'
  EXEC ' + QUOTENAME(SERVERNAME) + '.'
  + QUOTENAME(DBNAME) + '.sys.sp_executesql @sql;'
  FROM @dbs;

-- feel free to change the 3rd parameter here:

EXEC sys.sp_executesql @sql, N'@sql NVARCHAR(MAX)', 
  N'SELECT @@SERVERNAME, DB_NAME(), actual_columns FROM dbo.table_name;';

Điều này sẽ không thành công nếu table_name không tồn tại, vì vậy bạn có thể vẫn còn một số việc phải làm nếu bạn muốn tạo điều kiện xử lý lỗi. Nhưng điều này sẽ giúp bạn bắt đầu.

Ngoài ra, hãy lưu ý và sử dụng nhất quán tiền tố lược đồ. Bối cảnh .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL để tìm kiếm lược đồ của tất cả các bảng

  2. Thêm khóa chính vào bảng hiện có

  3. CLR:Multi Param Aggregate, Argument không có trong đầu ra cuối cùng?

  4. Cách giữ dữ liệu trong hàng trong SQL Server

  5. Tạo người dùng trong cơ sở dữ liệu Azure SQL bằng các hàm Azure?