2011-09-21 6 views
1

큰 따옴표를 문자열 구분 기호로 사용하는 SQL 2008 T-SQL proc가 발생하는 것에 놀랐습니다. 예 :큰 따옴표를 사용하여 문자열을 구분할 수 있습니까?

DECLARE @SqlStmt AS VarChar(5000) 
SET @SqlStmt = "ok" 
PRINT @SqlStmt 

나는 그것이 허용되지 않는다고 생각했습니다. 아포스트로피 만 사용할 수 있다고 생각했습니다.

T-SQL은 Javascript와 같이 유연하여 하나의 명령문에서 두 개를 혼합하려는 경우 구분 기호로 사용할 수 있다고 생각하여 동적 SQL을 생성하기 위해 저장된 procs 중 하나에서 동일한 작업을 시도했습니다. 그것은 진드기를 포함했다. 스크립트가 컴파일되지 않는다는 것에 놀랐습니다. X가 인용 문자열의 내용 인 "INVALID COLUMN [X]"오류가 발생했습니다.

그래서 위에서 보았던 정확한 SQL을 컴파일하고 실행하고 "OK"를 인쇄 할 때까지는 가장 간단한 구성 요소를 제거했습니다.

이제 진짜 놀라운 부분 :

내가 내 클립 보드에 위의 T-SQL 스크립트를 배치, 동일한 연결을 사용하여 새 쿼리 창을 열려면 컨트롤 + N을 실행하고 새 쿼리 창에 위의 스크립트를 붙여 나는 새로운 창에 다음과 같은 오류를 얻는 것을보고 충격을 받았다 :

Msg 207, Level 16, State 1, Line 3 
Invalid column name 'ok'. 

설명 업데이트 :

은 분명히 내가 원래 스크립트에서 SET의 QUOTED_IDENTIFIER를 제거했지만, 나는 이미 그것을 실행했다원래 쿼리 창 있지만 옵션이 여전히 유효했다. 새 쿼리 창을 만들 때이 옵션은 기본적으로 꺼져 있습니다.

답변 해 주셔서 감사합니다.

답변

6

QUOTED_IDENTIFIEROFF 인 경우 문자열을 구분하는 데 사용할 수 있습니다. 그렇지 않으면 큰 따옴표로 묶인 항목이 객체 이름으로 해석됩니다.

"잘못된"설정에서 실행할 때 코드가 깨지지 않도록 항상 구분 기호가 필요한 개체 이름에 대해 문자열과 대괄호를 구분하려면 작은 따옴표를 사용하십시오.

+0

그랬습니다. 감사. 시스템이 나를 허용하자마자 대답을 받아 들일 것입니다 (바보 같은 편집, IMO) – ChadD

1

Martin Said와 마찬가지로 다음과 같이 사용할 수 있습니다.

SET QUOTED_IDENTIFIER OFF 
BEGIN 
DECLARE @SqlStmt AS VarChar(5000) 
SET @SqlStmt = "ok" 
PRINT @SqlStmt 
END 
+0

thx에 대한 추가 정보/설명 – ChadD

관련 문제