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 자체를 시도하지 않았습니다.
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 개의 기호가 추가됩니다.
우리는 200000 개의 행이있는 테이블에서 2 개의 쿼리를 만들려고했습니다.
select master.sys.fn_varbintohexstr(field)
from table`
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)
주 : 모든 코드가 공개 도메인으로 릴리스됩니다. 속성이 필요하지 않습니다.
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
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'