sp_msforeachdb는 장면 뒤에서 정확히 어떻게 작동합니까?


9

문제를 해결해야하며 문제를 극복하기 위해 sp_msforeachdb의 작동 방식을 이해하는 데 도움이 필요합니다.

sp_msforeachdb를 실행할 때마다 오류가 발생합니다. Msg 102, Level 15, State 1, Incorrect syntax near '61'

내 코드의 예는 다음과 같습니다.

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

그러나 sp_msforeachdb에 대한 매개 변수로 어떤 쿼리를 가지고 있는지는 중요하지 않습니다. 매번 같은 오류가 발생합니다. '61s1d'로 시작하는 데이터베이스가 있으므로 DB 이름에 문제가 있다고 생각하지만 sp_msforeachdb에서 어떤 문제가 발생했는지 솔직히 알 수 없습니다.

참고 사항

  • 숫자로 시작하는 유일한 데이터베이스입니다
  • "데이터베이스가 '% 61 %'와 같은 경우하지 말아야 ......"와 같은 코드를 사용하려고 할 수 있지만 여전히 같은 오류입니다.
  • 데이터베이스 이름 변경을 테스트 할 수 없습니다. 너무 많은 것들이 연결되어 있습니다.
  • '51'로 시작하는 테스트 DB를 만들면 해당 데이터베이스에 대한 오류도 발생합니다

이걸 어떻게 극복 할 수 있습니까?

답변:


16

우선 sp_msforeachdb를 사용하지 않으면 몇 가지 알려진 문제가 있습니다. Aaron Bertrand의 버전을 여기여기 에서 사용하는 것이 좋습니다 .

그러나 커서, 동적 SQL 및 바꾸기를 사용합니다. sp_helptext를 사용하여 실제로 코드를 볼 수 있습니다.

EXEC sp_helptext sp_msforeachdb

이 코드를 사용하면 일부 문제가 해결됩니다.

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

괄호는 언급 한 특정 문제입니다. 그러나 [또는]가 포함 된 데이터베이스가 있으면 문제가 발생합니다.


"?"주위에 대괄호를 사용하여 흥미 롭습니다. 에서 일했다. Aaron Bertrand의 버전을 살펴 보겠습니다. 커서로 인해 성능이 크게 저하 된 것을 보셨습니까?
Jeff.Clark

2
커서는 행이 몇 개 이상인 경우 실제 성능 문제 일뿐입니다. 허용 된 최대 데이터베이스 수에 근접하지 않으면 문제가 발생하지 않습니다. 문제는 데이터베이스를 건너 뛸 수 있다는 것입니다. Aaron의 기사를 읽고 더 자세히 설명합니다.
케네스 피셔

1
한 번 이상 DB를 완전히 건너 뛰는 것을 보았습니다. Aaron 's를 사용하면 훨씬 더 안정적입니다.
Kris Gruttemeyer

11

@Kenneth가 말한 것에 동의하지 않으면, 발생하는 오류와 관련이 없음을 지적해야합니다 sp_MSForEachDB. 데이터베이스 이름이 어떻게 지정 되었습니까? 숫자로 시작합니다. 데이터베이스뿐만 아니라 개체 이름 지정 규칙은 데이터베이스 식별자 의 MSDN 페이지에 자세히 설명되어 있습니다. "일반 식별자 규칙"을 따르면 해당 이름을 대괄호 나 큰 따옴표로 묶을 필요 가 없습니다 . 하지만 그 규칙을 벗어나는 이름은 않습니다 (항상)로 묶어야합니다.


1
이 정보에 대해서도 감사합니다. 나는 그 제한을 몰랐습니다. 불행하게도 나는 회사 :에 합류하기 전에 데이터베이스가 십 년간을 만들어 졌다고
Jeff.Clark

@ Jeff.Clark 나는 당신이 그것을 바꿀 수 없다는 질문에서 언급했듯이 DB의 이름을 바꿀 것을 제안하지 않았습니다. 나는 당신과 다른 사람들이 데이터베이스 이름을 어디에서나 지정해야 할 때마다 다시 나타날 것이기 때문에 실제 문제를 알기를 원했습니다. 그리고 전체 규칙 집합을 읽으면 데이터베이스, 테이블, 열, 인덱스, 제약 조건 등과 같이 이름이 필요할 다른 항목을 항상 대괄호 나 큰 따옴표로 묶지 않아도됩니다.
Solomon Rutzky
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.