it-swarm-ko.tech

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

PRINT를 사용하여 테이블에서 일부 값을 인쇄하기 위해 SQL Server 2000을 사용하고 있습니다. 문자열이 아닌 대부분의 데이터를 사용하여 인쇄 할 수 있도록 nvarchar로 캐스팅 할 수 있지만 이진 값은 문자의 비트 표현을 사용하여 변환하려고합니다. 예를 들면 다음과 같습니다.

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

예상 :

0x12345678

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

이진 데이터의 값을 어떻게 인쇄 할 수 있습니까? 내장 또는 롤업이 필요합니까?

업데이트 : 이것은 라인의 유일한 값이 아니므로 @binvalue를 인쇄 할 수는 없습니다. PRINT N'other stuff '+ ???와 비슷한 것입니까? + '더 많은 것들'. 그것이 차이가 있는지 확실하지 않습니다 : 나는 PRINT @ binvalue 자체를 시도하지 않았습니다.

35
Tadmas

Sql Server 2005를 사용하는 경우 다음을 사용할 수 있습니다.

print master.sys.fn_varbintohexstr(@binvalue)

나는 그것이 2000에 존재한다고 생각하지 않기 때문에 자신의 롤을해야 할 수도 있습니다.

29
Eric Z Beard

master.sys.fn_varbintohexstr를 사용하지 마십시오. 매우 느림, 문서화되지 않은, 지원되지 않는 및 향후의 SQL Server 버전에서 사라질 수 있음.

binary(16)을 16 진 문자로 변환해야하는 경우 convert를 사용하십시오.

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

왜 34? 16*2 + 2 = 34이므로 "0x"-2 개의 기호와 각 문자에 대해 2 개의 기호가 추가됩니다.

우리는 200000 개의 행이있는 테이블에서 2 개의 쿼리를 만들려고했습니다.

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

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

44
Ihor B.
select convert(varchar(max), field , 1) 
from table

using varchar(max)을 사용하면 크기 (종류)를 지정하는 것에 대해 걱정할 필요가 없습니다.

22
Charlie Affumigato

이진 데이터를 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)

: 모든 코드가 공개 도메인으로 릴리스됩니다. 속성이 필요하지 않습니다.

8
Ian Boyd

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 's 전에 인쇄 할 수없는 문자가 있습니다. 이미지를 게시했지만 포인트가 충분하지 않습니다).


편집 : 추가하기 만하면 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
2
David Claughton
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 Edition에서 어떻게 구현되었는지 확인하려면 다음을 실행할 수 있습니다.

sp_helptext 'fn_varbintohexsubstring'
2
Ricardo C