Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kursor SQL Server - loop melalui beberapa server dan jalankan kueri

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;

Perubahan:

  1. Tidak ada alasan untuk menggunakan opsi kursor default di sini - global, dapat diperbarui, dinamis, dapat digulir, dll. Latar Belakang .

  2. Sebagai kebiasaan/praktik terbaik, gunakan sp_executesql dan bukan EXEC() . Meskipun tidak terlalu penting dalam kasus ini, itu bisa menjadi masalah di orang lain, jadi saya lebih suka untuk selalu membuat kode dengan cara yang sama. Latar Belakang .

  3. Juga, harap biasakan mengakhiri pernyataan Anda dengan titik koma. Anda harus, pada akhirnya. Latar Belakang .

EDIT

Sekarang kami memiliki sedikit lebih banyak informasi tentang persyaratan Anda yang sebenarnya, saya menyarankan sedikit kode ini. Oh, dan lihat, tidak ada kursor (yah, tidak ada eksplisit deklarasi kursor dan semua perancah yang menyertainya)!

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;';

Ini akan gagal jika table_name tidak ada, jadi Anda mungkin masih memiliki beberapa pekerjaan yang harus dilakukan jika Anda ingin memfasilitasi penanganan kesalahan. Tapi ini akan membantu Anda memulai.

Juga, harap perhatikan, dan gunakan secara konsisten, awalan skema. Latar Belakang .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tally Table untuk memasukkan tanggal yang hilang di antara dua tanggal? SQL

  2. Hasilkan skrip di SQL Server Management Studio

  3. Cara Menambahkan Batasan Kunci Asing ke Tabel yang Ada di SQL Server (T-SQL)

  4. Bagaimana sys.dm_exec_describe_first_result_set Bekerja di SQL Server

  5. Kueri SQL untuk mencocokkan kata kunci?