2009-06-04 2 views
40

SQL Server 2005에서 텍스트 데이터가 8192를 초과하는 행이있는 varchar (MAX) 열을 쿼리하려고합니다. 그러나 Management Studio에서 나는 도구 -> 옵션 -> 쿼리 결과 -> 결과 -> 각 열에 표시되는 최대 문자 수 = 8192이며 최대 값입니다. 따라서 텍스트 출력에 의해 부과 된 제한 때문에 이러한 행의 잘림이 발생하는 것 같습니다.SQL Server 잘림 및 8192 제한

이 문제를 해결하는 유일한 방법은 SUBSTRING 함수를 사용하여 처음 8000 자, 다음 8000 자 등을 잡는 것입니다. 그러나 이것은 추악하고 오류가 발생하기 쉽습니다.

SSIS와 BCP는 나를위한 옵션이 아닙니다.

누구에게 더 좋은 제안이 있습니까? 감사!

+1

당신은 출력 쿼리 분석기에서 표시되는 방법에 관심이 있습니까? 데이터를 살펴보기 위해이 코드를 사용하고 있다면 "오류가 발생하기 쉬운"코드와 "못생긴"코드에 너무 매달 리지 않을 것입니다. 생산 작업을 위해 이것을 사용한다면 그것은 또 다른 문제입니다. –

+0

Tom : 데이터를 보는 것만이 아닙니다. 쿼리 결과를 사용하여 원격 서버에 대한 새 저장 프로 시저 호출을 생성하므로 결과가 '완벽해야'합니다. –

+1

하지만 SSMS를 사용하여 쿼리를 실행하는 이유는 무엇입니까? 프로그램에서 동일한 쿼리를 실행하면 어떻게됩니까? –

답변

57

당신은 절단되지 않습니다 플랫 파일로 데이터를 내보낼 수 있습니다. 이렇게하려면 다음을 수행

  1. 오른쪽 데이터베이스를
  2. 클릭 작업을 클릭 -> 데이터 내보내기
  3. 은 데이터 소스
  4. 이 대상 유형에 대해 "플랫 파일 대상"을 선택 (기본값은 괜찮을 것)을 선택합니다.
  5. 출력 파일 이름을 선택하십시오. 에
  6. 선택, "테이블 복사 또는 쿼리 지정"

남은 단계는 자기 설명해야한다 쿼리에

  • 붙여 넣기 "를 전송하는 데이터를 지정하는 쿼리를 작성합니다." 이렇게하면 파일이 텍스트로 출력되고 좋아하는 텍스트 편집기에서 열 수 있습니다.

  • +0

    +1은 맞춤 도구를 작성하지 않고도 작동하는 솔루션입니다. 형식 (띄어쓰기)을 변경하지 않고 XML 데이터를 내보내려고 했으므로 XML로 내보내기가 옵션이 아니 었습니다. – mlhDev

    +0

    이것은 허용 된 대답이어야합니다. –

    +0

    @ Torre .. 고마워. 내 하루를 구했다. :) –

    0

    당신이 말하는 잘림은 Management Studio에서만 발생합니다. 열을 다른 앱으로 가져 오면 잘리지 않습니다.

    Query Analyzer를 사용하여 SQL Server 2005와 통신하는 방법이 없습니다 .Management Studio를 의미합니까?

    +0

    그는 Management Studio를 의미한다고 생각합니다. "결과를 모눈"으로 전환하면 열당 최대 값이 65535로 표시됩니다. SQL에서 코드를 작성하려고하는 것처럼 들리 겠지만 확실한가요? – GalacticCowboy

    +0

    죄송합니다, Management Studio를 의미합니다. –

    0

    주어진 경우 "XML 자동"또는 "XML 원시"또는 "XML 명시 적"으로 데이터를 반환하는 쿼리를 선택하면 한계가 훨씬 높아져 출력 된 데이터를 훨씬 더 많이 처리 할 수 ​​있습니다. 결과.

    +0

    이것은 또한 출력을 자릅니다 ... –

    +0

    @Jaco - 그러나 이것을 피하기 위해 SSMS에서 XML 제한을 구성 할 수 있습니다. 내 대답을 보라. –

    4

    내 솔루션은 약간 라운드에 대한했지만 (출력 미만 65535 자만큼)이 을 저를 얻었다 : SQL Management Studio에서

    1. 을, 구라 결과에 대한 제한을 설정 65535 (그리드에 도구> 옵션> 질의 결과> SQL 서버> 결과> 비 XML 데이터)
    2. 쿼리를 실행 그리드로 출력
    3. 선택 결과를 마우스 오른쪽 단추로 클릭하고 "다른 이름으로 결과 저장 ..."와 결과를 파일에 저장하십시오.
    4. 출력을

    UPDATE를 얻을 수 메모장 또는 유사한에서 파일을 엽니 다

  • 이 작동하는지 보여주기 위해 여기에 하나 10 만 문자 열을 선택 일부 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. 내가 orignally 생각으로, 문자 길이 설정이 무엇인지 어떤 변화를하지 않는 것.
    2. SQL 2008 R2 (서버 및 Management Studio 모두)를 사용 중입니다.
    3. 긴 열이 로컬 변수에 저장되거나 (이 예와 같이) 선택되지 않으면 차이가없는 것처럼 보입니다. 실제 테이블
  • +1

    이것은 작동하지 않습니다. 파일에 여전히 데이터가 잘 렸습니다. – SFun28

    +0

    불편을 끼쳐 드려 죄송합니다. 나는 그것이 작동하는지 테스트하는 방법과 그것이 작동한다는 것을 알 수있는 조건에 대한 몇 가지 노트를 보여주는 코드를 추가했다. –

    +1

    나를 위해 작동하지 않습니다. MS SQL 관리 스튜디오 2008 R2. –

    0
    나는 보통 (누가 복음에서 테스트 장치를 사용하여) 출력으로 거대한 디버그 문자열을 얻기 위해 XML을 사용

    :

    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; 
    
    +0

    '@ test'에'2 <3'가 포함되어 있으면 불어납니다. –

    +0

    좋은 지적입니다. 당신은 XML 경로가 그들을 대체하게 할 수 있습니다 ... 당신이 무엇을하고 있는지 확실하지 않습니다. 최소한 위로 날려 버려라 :) 개정 pls를 조사해라. –

    +0

    폭발하지는 않지만 결과가 변경됩니다! –

    25
    나는 또한 XML을 사용

    하지만 XML로 대부분의 문제를 주변에 도착 a slightly different method을 entitisation.

    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

    +2

    분명히 최상의 솔루션입니다. –

    +0

    비 xml 데이터를 제한없이 포기할 수있는 방법이 있습니까? 나는 하한이 30이고 더 높은 것이 65535라는 것을 볼 수있다. – pordi

    +0

    @BabekoofCoder - 불행히도. 따라서 XML 해결 방법으로 non xml을 캐스팅 할 필요가 있습니다. –

    3

    XML을 내보내려고 시도했습니다. 이것은 내가 사용한 해결책입니다 :

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

    저는 SSMS 10을 사용하고 있으며 Torre의 솔루션을 사용할 수 없습니다. 데이터를 선택하면

    "입력 열"XML_F52E2B61-18A1-11d1-B105-00805F49916B의 데이터 유형이 "(26)"SSMS에서 DT_IMAGE

    +0

    그 'DT_IMAGE' 문제도 있었지만 다른', type', 내 XML 생성 문에서 바깥 쪽'select() as columnname'을 추가하고 내보내기 마법사에서 유니 코드 확인란을 확인하여 해결했습니다. – Nathan

    0

    입니다 : 내보내기 마법사는 입력 열이 이미지였다 생각 보관 행에서 적은 수의 문자로 제한되지만 행에서 데이터를 편집하면 전체 값이 표시됩니다. 그것은 항상있을 수는 없지만 Ctrl-a, ctrl-c를 누른 다음 편집기에서 지나면 모두 존재합니다.

    0

    또 다른 해결 방법은이 까다로운 쿼리에 HeidiSql을 사용하는 것입니다. 필드 길이에 제한이 없습니다.

    2

    간단한 해결책을 시도 했습니까? 2 번의 클릭 만!쿼리 창에서

    ,

    1. 설정 쿼리 옵션 "그리드에 대한 결과는"쿼리를 실행하는
    2. 오른쪽 그리드 모서리에있는 결과 탭을 클릭 모든 파일로 결과를 저장

    파일에 표시하고 싶은 모든 텍스트가 표시됩니다. 나는 VARCHAR (MAX) 필드의 내 결과를 130,556 문자를 볼 수 있습니다

    Just Two Clicks away!