sql - SQL 选择从十六进制转换为 ASCII/varchar
问题描述
我将数据存储在 SQL Server 表的列中,如下所示:
0x003600380032003200330031002D003400
我知道这个输出应该是:
682231-4
有人可以帮我转换 SQL 代码吗?
就像是:
select converttochar (0x003600380032003200330031002D003400)
退货:682231-4
我不确定我是在看十六进制还是二进制转换还是什么....
解决方案
这实际上看起来像你在开始时nvarchar
有一个领先00
。这很混乱,但会起作用:
SELECT CONVERT(nvarchar(30),CONVERT(varbinary(60),STUFF(CONVERT(VARCHAR(60), 0x003600380032003200330031002D003400,1),3,2,''),1));
这会去除前导00
字符,生成 value 0x3600380032003200330031002D003400
,即的nvarchar
值N'682231-4'
。
它通过将 a 转换varbinary
为 avarchar
但使用样式代码来去除值1
,这意味着您有 avarchar
的值'0x3600380032003200330031002D003400'
;允许您执行字符串操作。然后我使用STUFF
删除字符并CONVERT
使用样式代码1
使其varbinary
再次成为一个。
或者,您可以删除所有空字符元组并进行转换。这看起来更混乱,因为你不能只是一揽子替换'00'
(或者我觉得它不“安全”),所以我将字符放入他们的元组中,然后重建:
DECLARE @YourBinary varbinary(60) = 0x003600380032003200330031002D003400;
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP(60) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
FROM N N1, N N2, N N3)
SELECT CONVERT(varchar(60),CONVERT(varbinary(60),(SELECT V.SS + ''
FROM Tally T
CROSS APPLY(VALUES(SUBSTRING(CONVERT(varchar(60),@YourBinary,1),(T.I*2)+1,2)))V(SS)
WHERE V.SS NOT IN ('00','')
FOR XML PATH(''),TYPE).value('.','varchar(60)'),1));
但是,如果您的某些价值观具有领先地位00
而其他价值观却没有,那么这个想法可能会更好。当然,此解决方案还假设最终值为 a varchar
,而不是 a nvarchar
。
推荐阅读
- css - css中的2列布局(订购项目)
- compiler-errors - 在 Solaris_x86 上构建 OpenSSL 时,Assembler 报告非法助记符
- python - 用空间扩散因子对 Fitzhugh-Nagumo 模型进行数值求解
- macros - Common Lisp 宏中的闭包
- azure - Azure Invoke-AzVMRunCommand -
- flutter - Flutter Flare Teddy:我无法弄清楚如何使用 Teddy | TrackingTextInput _controller 和我的控制器都在 TextField
- javascript - Scrollify (jquery) - 在站点的某些页面上禁用插件(新手)
- javascript - Nodejs SQLite回调执行返回未定义
- node.js - 如何在 res.redirect('/') 之后执行操作或发送信息?
- java - 在 Apache Spark 中对多个列进行分组并从 DataFrame 中计数 - Java