SQL Server 2008 Management Studio에서 text 또는 varchar (MAX) 열의 전체 내용을 보려면 어떻게합니까?


98

이 라이브 SQL Server 2008 (빌드 10.0.1600) 데이터베이스에는 .txt 라는 열 Events이 포함 된 테이블이 있습니다 . (예, 이것이 실제로 열 이어야한다는 것을 알고 있지만이 데이터베이스를 설정 한 사람은 그렇게하지 않았습니다.)textDetailsvarchar(MAX)

이 열에는 SQL Server Management Studio를 통해 액세스하려는 매우 큰 예외 로그 및 관련 JSON 데이터가 포함되어 있지만 그리드에서 텍스트 편집기로 결과를 복사 할 때마다 43679 자에서 잘립니다.

인터넷의 다양한 위치에서 XML 데이터에 대해 검색되는 최대 문자 Tools > Options > Query Results > SQL Server > Results To Grid를 무제한으로 설정 한 다음 다음과 같은 쿼리를 수행 할 수 있다는 내용을 읽었습니다 .

select Convert(xml, Details) from Events
where EventID = 13920

(데이터는 열이 전혀 XML이 아닙니다. CONVERT열을 XML로 지정하는 것은 다른 사람이 SSMS가 text또는 varchar(MAX)열 에서 데이터를 검색 할 때 갖는 한계를 극복하는 데 사용한 Google 검색에서 찾은 해결 방법 일뿐 입니다.)

그러나 위의 옵션을 설정하고 쿼리를 실행하고 결과에서 링크를 클릭 한 후에도 여전히 다음 오류가 발생합니다.

XML을 표시 할 수 없습니다. 다음 오류가 발생했습니다. 예기치 않은 파일 끝이 발생했습니다. 5 행, 위치 220160.

한 가지 해결책은 XML 데이터에 대해 서버에서 검색되는 문자 수를 늘리는 것입니다. 이 설정을 변경하려면 도구 메뉴에서 옵션을 클릭합니다.

그래서, 에 어떤 아이디어는 어떻게 데이터에 액세스하려면? varchar(MAX)내 문제 를 해결 하기 위해 칼럼을 전환 할까요?

답변:


98

SSMS는 XML 데이터에 대해 무제한 데이터 만 허용합니다. 이것은 기본값이 아니며 옵션에서 설정해야합니다.

여기에 이미지 설명 입력

매우 제한된 상황에서 작동 할 수있는 한 가지 트릭은 XML 데이터로 처리되도록 아래와 같이 특별한 방식으로 열 이름을 지정하는 것입니다.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,100000) + 'B' 

SELECT @S as [XML_F52E2B61-18A1-11d1-B105-00805F49916B]

SSMS (최소 버전 2012 ~ 18.3 현재 버전)에서는 다음과 같은 결과가 표시됩니다.

여기에 이미지 설명 입력

그것을 클릭하면 XML 뷰어에 전체 결과가 열립니다. 오른쪽으로 스크롤하면 B의 마지막 문자가 유지되고

그러나 이것은 몇 가지 중요한 문제가 있습니다. 쿼리에 추가 열을 추가하면 효과가 중단되고 추가 행이 모두 첫 번째 행과 연결됩니다. 마지막으로 문자열 <에 XML 뷰어 열기 와 같은 문자가 포함되어 있으면 구문 분석 오류와 함께 실패합니다.

SQL Server 가 이러한 문자로 인해 변환 되거나 실패 <하는 문제를 방지하는보다 강력한 방법 &lt;은 다음과 같습니다 ( Credit Adam Machanic here ).

DECLARE @S varchar(max)

SELECT @S = ''

SELECT @S = @S + '
' + OBJECT_DEFINITION(OBJECT_ID) FROM SYS.PROCEDURES

SELECT @S AS [processing-instruction(x)] FOR XML PATH('')

2
Convert 문에 CDATA를 추가하면 효과가 있습니다! 감사합니다. :)
adamjford

추가 CDATA는 작동 할 수 있지만 데이터에 제어 문자가 포함 된 경우 바꾸기 작업을 수행해야합니다. 제 경우에는 데이터 내에서 단위 구분 기호, ASCII 코드 31을 사용했습니다. 그 하나의 캐릭터 만 여러 곳에서 사용하고 있었기 때문에 단순한 것으로 REPLACE(details, char(31), '&x1f;')충분했습니다. 알 수없는 문자가 있거나 대체 할 여러 문자가있는 경우 다른 해결책을 찾아야 할 수 있습니다.
Zarepheth

@Zarepheth-그게 CDATA내 첫 제안이었습니다. 나중에 하나 AS [processing-instruction(x)]는 그것을 피합니다.
Martin Smith

2
@MartinSmith 훌륭한 대답! 내가 당신의 대답에서 얼마나 배웠는지 궁금합니다! +1
Kin Shah

53

나는 이것을 작동시킬 수 있었다 ...

SELECT CAST('<![CDATA[' + LargeTextColumn + ']]>' AS XML) FROM TableName;

27

한 가지 해결 방법은 결과 집합을 마우스 오른쪽 단추로 클릭하고 "다른 이름으로 결과 저장 ..."을 선택하는 것입니다. 열의 전체 내용이 포함 된 CSV 파일로 내 보냅니다. 완벽하지는 않지만 충분히 잘 작동했습니다.

해결 방법


11

이 간단한 솔루션을 사용해 보셨습니까? 두 번만 클릭하면됩니다!

쿼리 창에서

  1. 쿼리 옵션을 "Results to Grid"로 설정하고 쿼리를 실행합니다.
  2. 그리드 모서리에서 결과 탭을 마우스 오른쪽 버튼으로 클릭하고 결과를 파일로 저장합니다.

파일에서보고 싶은 모든 텍스트를 얻을 수 있습니다 !!! varchar (MAX) 필드의 결과로 130,556자를 볼 수 있습니다.

파일 결과


1
스트레이트 - 쉬운 - 당신이 :) 다시 필요할 때까지 항상 잊어
Dimi 타 키스

5

내가 찾은 가장 간단한 해결 방법은 테이블을 백업하고 스크립트를 보는 것입니다. 이것을하기 위해

  1. 데이터베이스를 마우스 오른쪽 버튼으로 클릭하고 Tasks>Generate Scripts...
  2. "소개"페이지 클릭 Next
  3. "객체 선택"페이지
    1. 을 선택 Select specific database objects하고 테이블을 선택합니다.
    2. 딸깍 하는 소리 Next
  4. "스크립팅 옵션 설정"페이지
    1. 출력 유형을 Save scripts to a specific location
    2. Save to file관련 옵션을 선택 하고 입력 하십시오.
    3. 클릭 Advanced버튼을
    4. General> Types of data to scriptData only또는로 설정 Schema and Data하고 확인을 클릭합니다.
    5. 딸깍 하는 소리 Next
  5. "요약 페이지"다음을 클릭
  6. 4.2에서 설정 한 옵션을 기반으로 SQL 스크립트를 생성해야합니다. 이 파일을 열고 데이터를 봅니다.

3

TEXT 데이터 유형은 오래되어 더 이상 사용하지 않아야합니다. TEXT 열에서 데이터를 선택하는 것은 고통 스럽습니다.

ntext, text 및 image (Transact-SQL)

ntext, text 및 image 데이터 유형은 향후 버전의 Microsoft SQL Server에서 제거됩니다. 새로운 개발 작업에서 이러한 데이터 유형을 사용하지 말고 현재이를 사용하는 애플리케이션을 수정하십시오. 대신 nvarchar (max), varchar (max) 및 varbinary (max)를 사용하십시오.

텍스트 데이터를 검색 하려면 TEXTPTR (Transact-SQL) 을 사용해야 합니다.

또한 텍스트 데이터 유형 처리 에 대한이 문서를 참조하십시오 .


varchar(MAX)SSMS가 데이터를 자르지 않도록 열을 변환 합니까?
adamjford

먼저 SSMS를 사용하여 스크립을 생성하여 TEXT 열을 varchar (max)로 변환합니다. 거기에서 XML 열로 추가 변환 할 것인지 평가할 수 있습니다. SSMS 표시 제한의 경우 열당 최대 65,535 자의 비 XML 데이터를 표시하고 최대 무제한의 xml 데이터를 표시하도록 그리드에 대한 결과를 설정할 수 있습니다 (fyi, XML 유형의 테이블 열은 2GB 만 저장할 수 있음). 텍스트 결과는 열당 8192 자로 제한됩니다. 이러한 기본 최대 제한을 설정하려면 (SSMS에서) 도구 메뉴, 옵션 ..., 쿼리 결과, SQL SERVER, 그리드 또는 결과에 대한 결과로 이동하십시오.
KM.

3

Xml이 제대로 구성되지 않은 것 같습니다. 이 경우 Xml로 캐스트 할 수 없으며 Management Studio에서 반환 할 수있는 텍스트의 양이 제한됩니다. 그러나 다음과 같이 텍스트를 더 작은 덩어리로 나눌 수 있습니다.

With Tally As
    (
        Select ROW_NUMBER() OVER ( ORDER BY s1.object_id ) - 1 As Num
        From sys.sysobjects As s1
            Cross Join sys.sysobjects As s2
    )
Select Substring(T1.textCol, T2.Num * 8000 + 1, 8000)
From Table As T1
    Cross Join Tally As T2
Where T2.Num <= Ceiling(Len(T1.textCol) / 8000)
Order By T2.Num

그런 다음 수동으로 다시 결합해야합니다.

편집하다

textXml 파서가 좋아하지 않는 데이터에 일부 문자가있는 것 같습니다. 이러한 값을 엔티티로 변환 한 다음 Convert(xml, data)트릭 을 시도 할 수 있습니다. 그래서 다음과 같습니다.

Update Table
Set Data = Replace(Cast(Data As varchar(max)),'<','&lt;')

(대체 함수가 text열에서 작동하지 않기 때문에 varchar (max)로 캐스트 해야 text했습니다 varchar(max). 이러한 열을으로 변환 할 수없는 이유는 없습니다 .)


아, 열이 XML이 아님을 언급해야한다고 생각합니다. 열을 XML로 변환하는 것은 다른 누군가가 SSMS가 text또는 varchar(MAX)열 에서 데이터를 검색 할 때 갖는 한계를 극복하는 데 사용한 인터넷 검색에서 찾은 해결 방법 일뿐 입니다.
adamjford

1
위의 코드를 편집하십시오. * 8000 + 1, 8000) From YourTable As T1 Cross Join Tally As T2 Where T2.Num <= Ceiling (datalength (T1.YourTextCol) / 8000) Order By T2.Num
Ian Quigley

TSQL이 답변을 기반으로 @IanQuigley의을 사용하면 잘 작동했습니다. 기본적으로 결과 (11 개의 레코드가 됨)를 가져 와서 메모장에 붙여 넣었습니다. 완벽하게 작동했습니다. 이 스크립트를 저장해야합니다. 잘못된 문자가 포함 된 미친 긴 XML이 있습니다.
atconway

1

저는 SSMS에서 셀 단위로 열을 클릭 할 수 있도록하는이 간단한 XML 해킹을 선호합니다. 이 방법을 사용하면 SSMS의 표보기에서 데이터를 빠르게보고 특정 셀을 클릭하여 관심이있을 때 전체 값을 볼 수 있습니다. 이것은 XML 오류를 방지한다는 점을 제외하면 OP의 기술과 동일합니다.

SELECT
     e.EventID
    ,CAST(REPLACE(REPLACE(e.Details, '&', '&amp;'), '<', '&lt;') AS XML) Details
FROM Events e
WHERE 1=1
AND e.EventID BETWEEN 13920 AND 13930
;

일부 문자는 XML 1.0에서는 유효하지 않지만 NVARCHAR/ 에서는 유효합니다 VARCHAR. 예를 들어 NUL 문자 ( NULL필드 값과 다름 ). 이러한 포함 된 값이있는 문자열에 대해서는 캐스트가 실패합니다.
binki

1

SSMS 18.2부터 이제 그리드 결과에서 최대 2 백만 문자를 볼 수 있습니다. 출처

더 많은 데이터를 표시하고 (결과를 텍스트로) 셀에 저장 (결과를 그리드로) 할 수 있습니다. SSMS는 이제 두 가지 모두에 대해 최대 2M 문자를 허용합니다.

아래 코드로 이것을 확인했습니다.

DECLARE @S varchar(max) = 'A'

SET @S =  REPLICATE(@S,2000000) + 'B' 

SELECT @S as a

1
최대 문자는 실제로 2097152입니다 ( SSMS 버전 15.0.18333.0 ).
stomy

0

당신은 운이 좋지 않다고 생각합니다. 이 문제는 다른 모든 답변이 초점을 맞추는 것처럼 SQL 수준 문제가 아니라 단순히 사용자 인터페이스 중 하나입니다. Management Studio는 범용 / 일반 데이터 액세스 인터페이스가 아닙니다. 인터페이스가 아니라 관리 영역이며, 바이너리 데이터 및 대규모 테스트 데이터를 처리하는 데 심각한 제한이 있습니다. 지정된 사용 프로필 내에서 사용하는 사람들이이 문제에 부딪히지 않기 때문입니다.

대용량 텍스트 데이터를 제공하는 것은 단순히 계획된 사용이 아닙니다.

유일한 선택은 텍스트 입력을 받아 모든 행에 대해 행을 잘라내는 테이블 값 함수입니다. 따라서 Management Studio는 단일 행이 아닌 행 목록을 가져옵니다.


이 대답은 추측에 불과하다고 생각합니다. 아니면 "계획된 사용"에 대한 출처가 있습니까? SQL "관리 스튜디오"라면 최소한 내 데이터베이스의 내용을 보여줄 수 있어야합니다. 절대적으로 끔찍한 UI.
damd

이 답변은 더 이상 적용되지 않으므로 삭제해야합니다
Caius Jard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.