Programing

T-SQL의 PRINT 문

lottogame 2020. 11. 10. 07:40
반응형

T-SQL의 PRINT 문


T-SQL의 PRINT 문이 가끔씩 만 작동하는 것처럼 보이는 이유는 무엇입니까? 사용에 대한 제약은 무엇입니까? 결과 집합이 생성되면 null 함수가되어 결과 집합이 손상되는 것을 방지하는 것으로 가정했지만 출력이 행 개수와 같은 다른 결과 집합으로 나오지 않을 수 있습니까?


따라서 다음과 같은 진술이 있으면 '인쇄'결과가 없다고 말하는 것입니까?

sysobjects에서 * 선택
PRINT 'Just selected * from sysobjects'

SQL 쿼리 분석기를 사용하는 경우 아래쪽에 두 개의 탭이 있으며 그 중 하나는 "메시지"이고 여기에 '인쇄'문이 표시됩니다. print 문을 보는 타이밍
이 걱정된다면 다음과 같은 것을 사용해 볼 수 있습니다.

raiserror ( 'My Print Statement', 10,1) with nowait

이렇게하면 쿼리 분석기가 대부분의 조건에서 수행하므로 출력을 버퍼링하지 않고 명령문에 도달하면 즉시 메시지가 표시됩니다.


TSQL의 Print 문은 아마도 그 이름 때문에 오해의 소지가 있습니다. 실제로 메시지를 오류 / 메시지 처리 메커니즘에 보낸 다음 호출하는 응용 프로그램으로 전송합니다. PRINT는 꽤 멍청합니다. 8000 자 (4000 유니 코드 문자) 만 보낼 수 있습니다. 리터럴 문자열, 문자열 변수 (varchar 또는 char) 또는 문자열 식을 보낼 수 있습니다. RAISERROR를 사용하는 경우 2,044 자의 문자열로 제한됩니다. 그러나 표준 C 라이브러리의 이전 printf와 유사한 형식 지정 함수를 호출하므로 호출 응용 프로그램에 정보를 보내는 데 사용하는 것이 훨씬 쉽습니다. RAISERROR는 텍스트 메시지와 함께 오류 번호, 심각도 및 상태 코드를 지정할 수도 있으며 sp_addmessage 시스템 저장 프로 시저를 사용하여 만든 사용자 정의 메시지를 반환하는 데 사용할 수도 있습니다.

오류 처리 루틴은 메시지와 오류가 매우 유사하더라도 메시지 수신에 좋지 않습니다. 물론이 기술은 데이터베이스에 연결하는 실제 방식 (OLBC, OLEDB 등)에 따라 다릅니다. SQL Server 데이터베이스 엔진에서 메시지를 수신하고 처리하려면 System.Data.SQLClient를 사용할 때 InfoMessage 이벤트를 수신하기 위해 이벤트를 처리하는 메서드를 식별하는 SqlInfoMessageEventHandler 대리자를 만들어야합니다. SqlConnection 클래스에서. 시스템 관점에서 볼 때 이러한 메시지는 오류와 유사하기 때문에 심각도 및 상태와 같은 메시지 컨텍스트 정보가 콜백에 인수로 전달된다는 것을 알 수 있습니다.

정말 모호한 문제를 추적하려고 할 때 항상 사용하기 때문에 파일로 스풀링하는 경우에도 응용 프로그램에서 이러한 메시지를 가져 오는 방법을 갖는 것이 항상 좋은 생각입니다. 그러나 응용 프로그램에 항목을 표시하는 정보 수준을 예약 할 수없는 경우 최종 사용자가 해당 항목을 볼 수 있기를 바랍니다.


쿼리 분석기는 메시지를 버퍼링합니다. PRINT 및 RAISERROR 문은 모두이 버퍼를 사용하지만 RAISERROR 문에는 WITH NOWAIT 옵션이 있습니다. 메시지를 즉시 인쇄하려면 다음을 사용하십시오.

RAISERROR ('Your message', 0, 1) WITH NOWAIT

RAISERROR는 메시지의 400 자만 표시하며 텍스트 서식 지정을 위해 C printf 함수와 유사한 구문을 사용합니다.

WITH NOWAIT 옵션과 함께 RAISERROR를 사용하면 메시지 버퍼가 플러시되므로 이전에 버퍼링 된 모든 정보도 출력됩니다.


나는 최근에 이것을 만났고 결국 null 변수에 대한 convert 문이 있었기 때문에 끝났습니다. 이로 인해 오류가 발생했기 때문에 전체 print 문이 null로 렌더링되고 전혀 인쇄되지 않았습니다.

예-실패합니다.

declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)

예-다음과 같이 인쇄됩니다.

declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')

출력에서 실제로 인쇄 문이 누락 된이 질문을 읽는 다른 사람의 이익을 위해 실제로 인쇄가 실행되지만 클라이언트에 반환되지 않는 경우가 있습니다. 나는 그들이 무엇인지 구체적으로 말할 수 없습니다. print 문 바로 앞뒤에 go 문을 넣으면 실행되면 볼 수 있습니다.


이러한 인쇄 문과 관련된 변수가 출력 되었습니까? 그렇다면 변수에 값이 없으면 print 문이 출력되지 않는다는 것을 발견했습니다.

참고 URL : https://stackoverflow.com/questions/268384/print-statement-in-t-sql

반응형