programing

SQL Server 잘라내기 및 8192 제한

batch 2023. 9. 3. 12:25
반응형

SQL Server 잘라내기 및 8192 제한

SQL Server 2005에서 텍스트 데이터가 8192를 초과하는 일부 행이 있는 varchar(MAX) 열을 쿼리하려고 합니다.그러나 Management Studio의 Tools --> Options --> Query Results --> Results to Text --> 각 열에 표시되는 최대 문자 = 8192(최대)입니다.따라서 이러한 행의 절단은 텍스트 출력에 의해 부과되는 제한 때문에 발생하는 것으로 보입니다.

이 문제를 해결할 수 있는 유일한 방법은 SUBSTRING 기능을 사용하여 처음 8,000자, 다음 8,000자 등을 잡는 것입니다.하지만 이것은 보기 흉하고 오류가 발생하기 쉽습니다.

SSIS와 BCP는 나에게 선택사항이 아니라는 것을 언급해야 합니다.

더 좋은 제안이 있나요?감사합니다!

데이터를 잘리지 않는 플랫 파일로 내보낼 수 있습니다.작업 방법:

  1. 데이터베이스를 마우스 오른쪽 단추로 클릭합니다.
  2. 작업 -> 데이터 내보내기를 클릭
  3. 데이터 원본을 선택합니다(기본값은 정상이어야 함).
  4. 대상 유형에 대해 "플랫 파일 대상"을 선택합니다.
  5. 출력할 파일 이름을 선택합니다.
  6. "테이블 복사본 또는 쿼리 지정"에서 "전송할 데이터를 지정하기 위한 쿼리 작성"을 선택합니다.
  7. 쿼리에 붙여넣기

나머지 단계는 스스로 설명할 수 있어야 합니다.그러면 파일이 텍스트로 출력되고 즐겨찾는 텍스트 편집기에서 파일을 열 수 있습니다.

또한 XML을 사용하지만 XML 사용 권한과 관련된 대부분의 문제를 해결하는 약간 다른 방법을 사용합니다.

declare @VeryLongText nvarchar(max) = '';

SELECT top 100 @VeryLongText = @VeryLongText + '

' + OBJECT_DEFINITION(object_id) 
FROM sys.all_objects 
WHERE type='P' and is_ms_shipped=1

SELECT LEN(@VeryLongText)

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

PRINT @VeryLongText /*WILL be truncated*/

SSMS의 "XML 데이터" 한계가 충분히 높게 설정되었는지 확인합니다!

Screenshot

이 간단한 해결책을 시도해 보셨습니까?두 번 클릭만 하면 됩니다!

쿼리 창에서

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

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

Just Two Clicks away!

제 해결책은 약간 우회적이었지만 저를 거기에 이르게 했습니다. (출력이 65535자 미만인 경우) :

  1. SQL Management Studio에서 그리드 결과에 대한 제한을 65535로 설정합니다(Tools > Options > Query Results > SQL Server > Results to Grid > Non XML data).
  2. 쿼리 실행, 그리드 출력
  3. 결과를 마우스 오른쪽 단추로 클릭하고 "다른 이름으로 결과 저장..."을 선택한 후 결과를 파일에 저장합니다.
  4. 출력을 얻으려면 메모장 등에서 파일을 엽니다.

업데이트: 이 기능이 작동함을 보여주기 위해 100,000자의 단일 열을 선택하는 SQL이 있습니다.그리드 출력을 csv 파일에 저장하면 100,000자 모두가 잘리지 않고 있습니다.

DECLARE @test nvarchar(MAX), @i int, @line nvarchar(100)
SET @test = ''; SET @i = 100
WHILE @i < 100000
BEGIN
    SET @test = @test + STUFF(REPLICATE('_', 98) + CHAR(13) + CHAR(10), 1, LEN(CAST(@i AS nvarchar)), CAST(@i AS nvarchar))
    SET @i = @i + 100
END
SELECT @test

주의:

  1. 원래 생각했던 것처럼 글자 길이 설정이 무엇인지는 별 차이가 없는 것 같습니다.
  2. SQL 2008 R2(서버와 Management Studio 모두)를 사용하고 있습니다.
  3. 긴 열이 로컬 변수에 저장되어 있거나(이 예제에서처럼) 실제 테이블에서 선택되어 있으면 차이가 없는 것 같습니다.

XML을 내보내는 중에 이 문제를 발견했습니다. 다음 솔루션을 사용했습니다.

그리드에 결과 옵션을 선택하고 결과 창에 표시되는 링크를 마우스 오른쪽 단추로 클릭한 다음 다른 이름으로 결과 저장을 선택하고 모든 파일 파일 형식을 선택한 다음 파일 이름을 지정하고 저장을 클릭합니다.모든 xml 데이터가 파일에 올바르게 저장됩니다.

SSMS 10을 사용하고 있는데 토레의 솔루션이 작동하지 않았습니다.내보내기 마법사는 계속 입력 열이 이미지라고 생각했습니다.

입력 열 "XML_F52E2B61-18A1-11d1-B105-00805F49916B"(26)의 데이터 유형은 DT_IMAGE입니다.

SSMS에서 행에서 데이터를 선택하면 소수의 문자로 제한되지만 행에서 데이터를 편집하면 전체 값이 해당 문자로 표시됩니다.항상 있는 것은 아니지만 Ctrl-a, Ctrl-c를 누른 후 편집기에 붙여넣으면 모두 해당됩니다.

선택할 수 있는 경우 쿼리에서 "XML 자동용", "XML 원시용" 또는 "XML 명시용"으로 데이터를 반환하도록 합니다. 그러면 제한이 훨씬 더 높고 출력된 결과로 훨씬 더 많은 작업을 수행할 수 있습니다.

보통 XML을 사용하여 대용량 디버그 문자열을 출력합니다(Luke의 테스트 하니스 사용).

    declare @test nvarchar(max), @i int, @line nvarchar(100)
    set @test = ''; set @i = 100
    while @i < 100000
    begin
        set @test = @test + stuff(replicate('_', 98) + char(13) + char(10), 1, len(cast(@i as nvarchar)), cast(@i as nvarchar))
        set @i = @i + 100
    end
    -- ctrl+d for "results to grid" then click the xml output
    --select cast('<root>' + @test + '</root>' as xml)

-- revised
select @test for xml path(''), type;

또 다른 해결 방법은 이러한 까다로운 쿼리에 HeidiSql을 사용합니다.필드 조명에 제한이 없습니다.

사용자가 말하는 잘라내기는 Management Studio에서만 수행됩니다.열을 다른 앱으로 끌어다 놓으면 잘리지 않습니다.

Query Analyzer를 사용하여 SQL Server 2005와 대화할 수 없습니다.Management Studio를 말씀하시는 건가요?

언급URL : https://stackoverflow.com/questions/952247/sql-server-truncation-and-8192-limitation

반응형