SQL Server / T-SQL은 줄 연속을 지원하여 긴 문자열을 분리합니까?


13

때로는 하나 이상의 슈퍼 롱 (때때로 어리석은 긴 문자열)을 가진 SQL 스크립트가 있습니다. 일반적으로 이들은 VARBINARY파일 / 어셈블리를 나타내는 리터럴 / 상수이지만 때로는 텍스트입니다.

실제로 긴 문자열의 주요 문제점은 일부 텍스트 편집기가 문자열을 잘 처리하지 못한다는 것입니다. 예를 들어, 나는 문장 VARBINARY에서 사용 하는 리터럴을 가지고 있으며 CREATE ASSEMBLY [AssemblyName] FROM 0x....어셈블리 자체의 크기는 1MB 이상이며 텍스트 바이트에서 2 백만 자 이상에 해당합니다. 각 바이트에는 2 개의 문자가 16 진수 표기법으로 표시되어야하기 때문입니다 (예 0x1F: a 1및 a F). SSMS (SQL Server Management Studio)는이 작업을 제대로 처리하지 못하고 해당 줄을 스크롤하려고하면 몇 초 동안 중단됩니다. 실제로 일부 버전 (여전히 이러한 상황이 발생하는지 확실하지 않은 경우)에는 특정 길이에 대해 최소한 한 줄 이상의 스크립트를 열 때 긴 줄에 대한 경고가 표시됩니다.

두 번째 문제는 자동 줄 바꿈을 사용하지 않고 편집기에서 사용하거나 온라인으로 게시 할 때 서식이 복잡하다는 것입니다. 여기서 문제는 가로 스크롤 막대의 슬라이더가 매우 좁아서 조금만 움직여도 길지 않은 텍스트가 보이지 않게 스크롤된다는 것입니다.

이제 T-SQL은 줄 바꿈 또는 세미콜론으로 명령을 종료하지 않습니다 (SQL Server 2005부터 세미콜론이 선호 / 권장되지만). 따라서 SQL Server는 종료 시점을 알 수 있도록 각 명령문을 구문 분석하는 방법을 알고 있기 때문에 긴 행을 여러 행으로 나누고 newline/ carriage-return+ 만으로 분리하는 line-feed것은 무리가없는 것처럼 보입니다. 그러나 어느 경우에도 작동하지 않습니다.

PRINT 'Line1
Line2';

"메시지"탭에서 다음을 반환합니다.

Line1
Line2

그리고 개행이 리터럴 / 상수 내에 있으므로 충분합니다. 그러나이 작업을 수행해 VARBINARY도 효과가 없습니다.

PRINT 0x1234
5678;

나에게 오류를 준다.

답변:


13

고맙게도 \(백 슬래시) 문자 를 통해 T-SQL에서 줄 연속을 지원 합니다. 줄 끝에서 newline/ carriage-return+ 바로 앞에 배치 line-feed하면 줄 바꿈이 무시됩니다.

텍스트 문자열의 경우 다음과 같이 동작합니다.

PRINT 'Line1\
Line2';

"메시지"탭에서 다음을 반환합니다.

Line1Line2

이진 / 16 진 문자열의 경우 다음과 같이 동작합니다.

PRINT 0x1234\
5678;

"메시지"탭에서 다음을 반환합니다.

0x12345678;

SQL 스크립트에서 사용할 바이너리 파일 (어셈블리, 인증서)을 텍스트 16 진 문자열로 형식화하기 위해 GitHub에서 공개 소스로 릴리스 한 BinaryFormatter 라는 명령 행 유틸리티를 작성했습니다 . 이진 파일을 텍스트 표현으로 변환 할뿐만 아니라 줄 연속 VARBINARY을 사용하여 각 행당 사용할 지정된 문자 수에 따라 필요한만큼 많은 행에 긴 리터럴 을 분산 시킵니다. 결과는 다음과 같습니다.

4D5A09DE34F178313345A4\
00007F4E39782EFC48D842\
00000000

그런 다음 {...}아래 영역에 표시된 것처럼 스크립트에 복사하여 붙여 넣습니다 .

CREATE ASSEMBLY [AssemblyName]
FROM 0x\
{output from BinaryFormatter}
;

이 주제에 대한 자세한 내용은 내 블로그 게시물 : T-SQL의 Line-Continuation을 참조하십시오.

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