Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर कर्सर - एकाधिक सर्वरों के माध्यम से लूप करें और क्वेरी निष्पादित करें

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;

परिवर्तन:

  1. यहां डिफ़ॉल्ट कर्सर विकल्पों का उपयोग करने का कोई कारण नहीं है - वैश्विक, अद्यतन करने योग्य, गतिशील, स्क्रॉल करने योग्य, आदि। पृष्ठभूमि

  2. आदत/सर्वोत्तम अभ्यास के रूप में, sp_executesql का उपयोग करें और नहीं EXEC() . हालांकि इस मामले में यह वास्तव में मायने नहीं रखता है, यह दूसरों में मायने रखता है, इसलिए मैं हमेशा उसी तरह कोड करना पसंद करूंगा। बैकग्राउंड

  3. साथ ही, कृपया अपने बयानों को सेमी-कोलन से समाप्त करने की आदत डालें। आपको करना होगा, अंत में। बैकग्राउंड

संपादित करें

अब जब हमारे पास आपकी वास्तविक आवश्यकताओं के बारे में थोड़ी अधिक जानकारी है, तो मैं इस कोड का सुझाव देता हूं। ओह, और देखो, कोई कर्सर नहीं (ठीक है, नहीं स्पष्ट कर्सर घोषणाएं और उनके साथ आने वाले सभी मचान)!

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

यदि table_name मौजूद नहीं है तो यह विफल हो जाएगा, इसलिए यदि आप त्रुटि प्रबंधन को सुविधाजनक बनाना चाहते हैं तो आपके पास अभी भी कुछ काम हो सकता है। लेकिन इससे आपको शुरुआत करनी चाहिए।

साथ ही, कृपया स्कीमा उपसर्ग के प्रति सचेत रहें और उसका लगातार उपयोग करें। बैकग्राउंड




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एकाधिक तालिकाओं, स्तंभों में SQL Server 2008 में पूर्ण-पाठ खोज का उपयोग करना

  2. अद्यतन करें यदि मौजूद है तो SQL Server 2008 में INSERT करें

  3. अपने SQL सर्वर संस्करण की जाँच कैसे करें

  4. एसक्यूएल सर्वर 2008 के साथ अधिसूचना बदलें

  5. एसक्यूएल में पंक्तियों की कैस्केड कॉपी