TSQL에서 이진 값을 16진수로 인쇄하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/68677

  •  09-06-2019
  •  | 
  •  

문제

저는 SQL Server 2000을 사용하여 다음을 사용하여 테이블의 일부 값을 인쇄하고 있습니다. PRINT.대부분의 문자열이 아닌 데이터의 경우 nvarchar로 캐스팅하여 인쇄할 수 있지만 이진 값은 문자의 비트 표현을 사용하여 변환을 시도합니다.예를 들어:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

예상되는:

0x12345678

대신 두 개의 횡설수설 문자를 인쇄합니다.

바이너리 데이터의 값을 어떻게 인쇄할 수 있나요?내장되어 있나요? 아니면 직접 굴려야 하나요?

업데이트:이것이 행의 유일한 값이 아니므로 @binvalue를 PRINT할 수는 없습니다.PRINT N'other stuff' + ????에 더 가깝습니다.+ '더 많은 것'.차이가 있는지 확실하지 않습니다.나는 PRINT @binvalue 자체를 시도하지 않았습니다.

도움이 되었습니까?

해결책

SQL Server 2005를 사용한다면 다음을 사용할 수 있습니다.

print master.sys.fn_varbintohexstr(@binvalue)

하지만 2000년에는 그런 것이 존재하지 않는다고 생각하므로 직접 굴려야 할 수도 있습니다.

다른 팁

사용하지 마세요 master.sys.fn_varbintohexstr - 그것은 엄청 느림, 문서화되지 않음, 지원되지 않음 및 SQL Server의 향후 버전에서는 사라질 수 있습니다..

변환이 필요한 경우 binary(16) 16진수 문자로 사용하려면 convert:

convert(char(34), @binvalue, 1)

왜 34입니까?왜냐하면 16*2 + 2 = 34, 즉 "0x" - 2개의 기호와 각 문자에 대한 2개의 기호입니다.

200,000개의 행이 있는 테이블에 대해 2개의 쿼리를 만들려고 했습니다.

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

첫 번째는 2분 동안 실행되고 두 번째는 4초 동안 실행됩니다.

select convert(varchar(max), field , 1) 
from table

에 의해 using varchar(max) 크기(종류) 지정에 대해 걱정할 필요가 없습니다.

변환의 또 다른 예를 보여주는 답변 추가 바이너리 데이터를 16진수 문자열로 변환하고 다시 되돌립니다.

나는 가장 높은 것을 변환하고 싶다 timestamp 가치를 부여하다 varchar:

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

다음을 반환합니다.

LastTS
==================
0x000000000086862C

메모:사용하는 것이 중요합니다 CONVERT 변환하다 varbinary -> varchar.사용 CAST 작동 안 할 것이다:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

이진 데이터를 다음과 같이 처리합니다. 문자 16진수 값 대신 빈 문자열을 반환합니다.

거꾸로 해라

저장된 16진수 문자열을 다시 타임스탬프로 변환하려면 다음을 수행하세요.

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)

메모:모든 코드는 공개 도메인으로 공개됩니다.저작자 표시가 필요하지 않습니다.

DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

캐스팅하지 마세요.

캐스팅은 특정 데이터베이스에 대한 해당 데이터 정렬 설정의 값을 기준으로 바이너리를 텍스트로 변환합니다.

시작] 문자열 변수에서 인쇄 된 값이 필요한 경우 Eric Z Beard가 제안한 함수를 사용하십시오.

DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s

서버 버전으로 인해 이 기능을 사용할 수 없거나 특별한 권한이 필요한 경우 고유한 기능을 만들 수 있습니다.

해당 기능이 SQL Server 2005 Express 에디션에서 어떻게 구현되었는지 보려면 다음을 실행할 수 있습니다.

sp_helptext 'fn_varbintohexsubstring'

SQL Server 2005의 'hashbytes' 함수에서 반환된 16진수 값을 인쇄하는 동안 비슷한 문제에 대한 해결책을 찾는 동안 이 질문을 발견했습니다.

안타깝게도 이 버전의 SQL Server에서는 CONVERT가 전혀 작동하지 않는 것 같습니다. fn_varbintohexsubstring만 올바른 작업을 수행합니다.

나는 그랬다:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

다음은 SQL Server 2005에서 얻은 결과입니다(

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678

(실제로 '4Vx' 앞에는 인쇄할 수 없는 문자가 있습니다. 이미지를 게시하고 싶지만 아직 포인트가 부족합니다.)


편집하다:추가하자면 SQL Server 2008 R2에서는 CONVERT 문제가 다음 출력으로 해결되었습니다.

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top