VARCHAR을 VARBINARY로 변환


17

성능 추세를 모니터링하고 최적화가 필요한 영역을 식별 할 수 있도록 쿼리 계획과 함께 비싼 실행 쿼리 로그를 테이블에 보관했습니다.

그러나 쿼리 계획이 너무 많은 공간을 차지하는 시점에 도달했습니다 (각 쿼리에 대해 전체 계획을 저장하기 때문에).

따라서 QueryPlanHash 및 QueryPlan을 다른 테이블로 추출하여 기존 데이터를 정규화하려고합니다.

CREATE TABLE QueryPlans
(
    QueryPlanHash VARBINARY(25),
    QueryPlan XML,
    CONSTRAINT PK_QueryPlans PRIMARY KEY
    (
      QueryPlanHash
    )
);

query_plan_hashin 의 정의는 sys.dm_exec_query_stats이진 필드이므로 정기적으로 새 데이터를 삽입 할 것이므로 VARBINARY새 테이블의 데이터 유형에 사용 하고 있었습니다 .

그러나 아래 삽입이 실패합니다 ...

INSERT INTO QueryPlans
    ( QueryPlanHash, QueryPlan )
SELECT queryplanhash, queryplan
FROM
(
    SELECT 
      p.value('(./@QueryPlanHash)[1]', 'varchar(20)') queryplanhash,
      QueryPlan,
      ROW_NUMBER() OVER (PARTITION BY p.value('(./@QueryPlanHash)[1]', 'varchar(20)') ORDER BY DateRecorded) rownum
    FROM table
    CROSS APPLY QueryPlan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple[@QueryPlanHash]') t(p)
) data
WHERE rownum = 1

.... 오류와 함께

Implicit conversion from data type varchar to varbinary is not allowed. Use the CONVERT function to run this query.

문제는 쿼리 계획 해시가 이미 이진 형식이지만 XML 쿼리 계획에 VARCHAR로 저장되어 있다는 것입니다.

0x9473FBCCBC01AFE

BINARY로 변환은 완전히 다른 값을 제공합니다.

0x3078393437334642434342433031414645

XQuery select의 값 정의를 이진으로 변경하려고 시도했지만 값이 반환되지 않았습니다.

0x9473FBCCBC01AFEXML 쿼리 계획에서 값을 ?가 VARBINARY아닌 로 추출하는 방법은 VARCHAR무엇입니까?

답변:


28

문자열에서 변환 할 때 동일한 이진 값을 유지하려면 특정 스타일을 사용해야합니다. 그렇지 않으면 SQL Server는 문자열이 인코딩하는 것과 같은 방식으로 인코딩하는 시도 'bob'또는 'frank'.

즉, 입력 문자열이 올바르게 보이지 않습니다. 바이트가 누락되었거나 1 바이트가 너무 많습니다. 후행을 삭제하면 제대로 작동합니다 E.

SELECT CONVERT(VARBINARY(25), '0x9473FBCCBC01AF', 1);
------------ the ,1 is important ---------------^^^

결과는 이진입니다.

----------------
0x9473FBCCBC01AF

1
아, ,1내가 놓친 것입니다. 내가 기대했던 것보다 쉬웠다! 감사!
Mark Sinkinson

누락 / 추가 바이트가 확실하지 않습니다. 내가 가지고있는 2666 TRY_CONVERT
건의

홀수 문자 수를 가진 문자열에 문자 (예 : 0)를 추가해야 할 수 있습니다. 값이 변경되지만 항상 동일한 값을 동일한 방식으로 변경해야합니다 (0과의 충돌 여부에 관계없이 의심됩니다).
Aaron Bertrand

그게 버그가 아니야? xml의 ​​queryplanhash는 명시 적으로 그 값으로 설정됩니다 ... 반드시 a TRY_CONVERTBINARY반환해서는 안됩니다NULL
Mark Sinkinson

내 테이블에 저장된 값을 xml과 비교할 때 실제로 누락 된 0입니다. 따라서 값은 0x09473FBCCBC01AF 여야합니다. 간단한 REPLACE로 문제를 해결할 수 있지만 버그 일 것입니다.
Mark Sinkinson

0

XML 쿼리 계획에서 0x9473FBCCBC01AFE 값을 VARCHAR이 아닌 VARBINARY로 어떻게 추출합니까?

CASI 테이블을 쿼리하기 위해 HeidiSQL을 사용하는 것과 같은 문제에 직면하여 다음과 같이 fn_varbintohexstr ()으로 해결되었습니다 .

SELECT master.dbo.fn_varbintohexstr(table.hexfield) FROM table;

HeidiSQL에서는 값이 '0x3F3F3F3F3F3F3F3F'와 같이 잘못되었으며 '0x158B1DB75616484695684007CE98E21C'와 같이 정확 해졌습니다.

OBS : MSSQL 2008부터 작동합니다! 그것이 도움이되기를 바랍니다!


2
fn_varbintohexstr() 여기에 언급 된 사용에 대한주의 사항에 유의 하십시오 .
Erik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.