SQL Server가 시스템 프로 시저에 전달 된 문자열에 대한 개체 이름을 교환 할 수있는 기능


13

객체 이름을 시스템 저장 프로 시저에 전달하는 것이 합법적 인 이유는 무엇입니까 sp_helptext?

객체 이름을 문자열로 변환하는 메커니즘은 무엇입니까?

예 :

-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'

-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax

분리 된 스키마 이름과 프로 시저 이름 이 없으면 유효한 proc 이름을 작은 따옴표로 묶을 필요 가 없습니다 .. 인용 된 이름에서 문자열 리터럴로 자동 변환되어 매개 변수 값으로 전달되는 방법에 대한 설명을 찾고 있습니다.

해결해야 할 특정 문제가 없습니다. 나는 문서화되지 않은 것들에 대해 호기심이 많습니다.


댓글의 기고가이 대화방 으로 이동 되었습니다 .
Paul White 9

답변:


10

시스템 저장 프로 시저에 대한 첫 번째 인수 sp_helptext는 다음과 같습니다.

[@objname= ] 'name'
사용자 정의 된 스키마 범위 개체의 정규화 된 이름이거나 정규화되지 않은 이름입니다. 규정 된 개체가 지정된 경우에만 따옴표가 필요합니다. 데이터베이스 이름을 포함하여 완전한 이름이 제공되면 데이터베이스 이름은 현재 데이터베이스의 이름이어야합니다. 오브젝트는 현재 데이터베이스에 있어야합니다. name은 nvarchar(776)기본값 이며 기본값은 없습니다.

또한 구분 식별자 (데이터베이스 엔진)에 대한 설명서는 다음과 같습니다.

SQL Server에서 식별자를 매개 변수로 사용
많은 시스템 저장 프로 시저, 함수 및 DBCC 문은 개체 이름을 매개 변수로 사용합니다. 이러한 매개 변수 중 일부는 다중 부분 객체 이름을 허용하는 반면 다른 매개 변수는 단일 부분 이름 만 허용합니다. 단일 부분 또는 다중 부분 이름이 필요한지 여부는 SQL Server에서 매개 변수를 구문 분석하고 내부적으로 사용하는 방법을 결정합니다.

단일 부품 매개 변수 이름
매개 변수가 단일 부품 식별자 인 경우 다음과 같은 방법으로 이름을 지정할 수 있습니다.

  • 따옴표 나 구분 기호없이
  • 작은 따옴표로 묶음
  • 큰 따옴표로 묶음
  • 괄호로 묶음

멀티 파트 매개 변수 이름
멀티 파트 이름은 데이터베이스 또는 스키마 이름과 객체 이름을 포함하는 정규화 된 이름입니다. 멀티 파트 이름을 매개 변수로 사용하는 경우 SQL Server에서는 멀티 파트 이름을 구성하는 완전한 문자열을 작은 따옴표로 묶어야합니다.


sp_helptext단일 부분 (정규화되지 않은) 및 다중 부분 (정규화 된) 객체 이름을 모두 허용 하는 첫 번째 인수 입니다.

T-SQL 구문 분석기가 항목을 단일 부분 이름sp_helptext 으로 해석하면 (위의 네 가지 글 머리 기호에 따라) 결과 이름이 프로 시저에서 예상되는 (문자열 유형) 인수 값으로 전달됩니다.

파서가이를 multipart name 으로 볼 때, 텍스트는 명시된 바와 같이 작은 따옴표로 묶어야합니다.

멀티 파트 이름의 주요 기능은 .구분 기호 (구분 기호 외부)입니다.

이 질문의 예는 단일 부분 이름으로 해석됩니다.

myproc-단일 부분 (따옴표 또는 구분 기호없이-글 머리 기호 # 1)
[myproc]-단일 부분 (괄호 안에-글 머리 기호 # 4)
'myproc'-단일 부분 (작은 인용 부호-글 머리 기호 # 2)
'dbo.myproc'- 작은 따옴표가 필요한 멀티 파트
[dbo.myproc]-단일 부분 (괄호 안에-글 머리 기호 # 4)

질문의 마지막 두 예제는 모두 다중 부분 매개 변수 이름으로 구문 분석됩니다 (노출 된 .구분 기호 로 인해 ). 필요한 작은 따옴표가 없기 때문에 오류가 발생합니다.

dbo.myproc-작은 따옴표가없는 멀티 파트
[dbo]. [myproc]-작은 따옴표가없는 여러 부분

큰 따옴표를 사용한이 추가 예는 다음과 같습니다.

"dbo.myproc"-단일 부분 (큰 따옴표로 묶음-글 머리 기호 # 3)

프로 시저 매개 변수 값에 대해 유효한 단일 부품 이름으로 해석되지만 프로 시저 코드는 유연하게 수신되는 (다중 부분) 문자열을 해석 할 수 있습니다 ( PARSENAME및 사용 OBJECTID).

마지막으로 관심을 끌기 위해 여기에서 큰 따옴표를 사용하는 것은의 설정에 의존하지 않습니다 QUOTED_IDENTIFIER.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.