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:
-
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 .
-
Theo thói quen / phương pháp hay nhất, hãy sử dụng
sp_executesql
chứ không phảiEXEC()
. 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 . -
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 .