Chính xác thì sp_msforeachdb hoạt động như thế nào sau hậu trường?


9

Tôi cần khắc phục sự cố mà tôi đang gặp phải và tôi cần một số trợ giúp để hiểu cách sp_msforeachdb hoạt động để khắc phục sự cố của tôi.

Điều gì xảy ra là mỗi khi tôi chạy sp_msforeachdb, tôi gặp lỗi Msg 102, Level 15, State 1, Incorrect syntax near '61'

Một ví dụ về mã của tôi là như sau:

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                     FROM ?.sys.objects
                     WHERE name like ''%aetna%''

Tuy nhiên, tôi không có vấn đề gì với tham số đối với sp_msforeachdb. Mỗi lần tôi nhận được cùng một lỗi. Tôi có một cơ sở dữ liệu bắt đầu bằng '61s1d', vì vậy điều đó khiến tôi nghĩ rằng nó có vấn đề với tên DB, nhưng thật lòng tôi không biết điều gì xảy ra đằng sau hậu trường trên sp_msforeachdb.

Những điều cần lưu ý.

  • Đây là cơ sở dữ liệu duy nhất bắt đầu bằng một số
  • Tôi có thể thử sử dụng mã như "Nếu cơ sở dữ liệu giống như '% 61%' thì không ......", nhưng vẫn bị lỗi tương tự.
  • Tôi không thể kiểm tra việc thay đổi tên cơ sở dữ liệu - quá nhiều thứ được kết nối với nó.
  • Nếu tôi tạo một db kiểm tra bắt đầu bằng '51', thì tôi cũng gặp lỗi cho cơ sở dữ liệu đó

Làm thế nào tôi có thể vượt qua điều này?

Câu trả lời:


15

Trước hết không sử dụng sp_msforeachdb, nó có một số vấn đề đã biết. Bạn nên sử dụng phiên bản của Aaron Bertrand .

Tuy nhiên, nó sử dụng một con trỏ, SQL động và thay thế. Bạn thực sự có thể xem mã bằng cách sử dụng sp_helptext.

EXEC sp_helptext sp_msforeachdb

Nếu bạn sử dụng mã này, nó sẽ khắc phục một số vấn đề của bạn.

EXEC SP_msforeachdb 'SELECT ''?'' AS Database
                 FROM [?].sys.objects
                 WHERE name like ''%aetna%''

Các dấu ngoặc sẽ là vấn đề cụ thể mà bạn đề cập. Tuy nhiên, bạn sẽ gặp vấn đề nếu bạn có cơ sở dữ liệu có [hoặc] trong đó.


Thú vị, sử dụng dấu ngoặc quanh "?" trong từ đã làm việc. Tôi sẽ xem xét phiên bản của Aaron Bertrand. Bạn có nhận thấy sự suy giảm đáng kể về hiệu suất do con trỏ không?
Jeff.Clark

2
Con trỏ chỉ là một vấn đề hiệu suất thực sự khi bạn có nhiều hơn một vài hàng. Trừ khi bạn đang tiến gần đến số cơ sở dữ liệu tối đa cho phép bạn sẽ không gặp sự cố. Vấn đề là nó có thể bỏ qua cơ sở dữ liệu. Đọc bài viết của Aaron và anh ấy đi vào chi tiết hơn.
Kenneth Fisher

1
Tôi đã thấy nó bỏ qua DB hoàn toàn trong nhiều lần. Sử dụng Aaron, nó đáng tin cậy hơn nhiều.
Kris Gruttemeyer

11

Không đồng ý với bất cứ điều gì mà @Kenneth nói, tôi nên chỉ ra rằng lỗi bạn gặp phải không liên quan gì sp_MSForEachDB. Đó là do cách cơ sở dữ liệu được đặt tên: nó bắt đầu bằng một số. Các quy tắc đặt tên đối tượng (không chỉ Cơ sở dữ liệu) được chi tiết trong trang MSDN cho Mã định danh cơ sở dữ liệu . Nếu bạn làm theo "Quy tắc cho số nhận dạng thông thường" thì bạn không cần đặt các tên đó trong dấu ngoặc vuông hoặc dấu ngoặc kép. Nhưng những cái tên nằm ngoài những quy tắc đó cần phải được đính kèm (luôn luôn).


1
Cảm ơn bạn vì thông tin này cũng được - tôi không biết về hạn chế đó. Thật không may, cơ sở dữ liệu đã được tạo ra một thập kỷ trước khi tôi gia nhập công ty :)
Jeff.Clark

@ Jeff.Clark Tôi không gợi ý rằng bạn đổi tên DB như bạn đã đề cập trong câu hỏi rằng bạn không thể thay đổi nó. Tôi chỉ muốn bạn (và những người khác) biết vấn đề thực tế vì nó sẽ xuất hiện trở lại bất cứ lúc nào bạn cần chỉ định tên Cơ sở dữ liệu đó ở bất cứ đâu. Và đọc qua bộ quy tắc đầy đủ đó có thể giúp bạn tránh những thứ khác sẽ yêu cầu một tên - Cơ sở dữ liệu, Bảng, Cột, Chỉ mục, Ràng buộc, v.v. - để luôn được đặt trong dấu ngoặc vuông hoặc dấu ngoặc kép.
Solomon Rutzky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.