我们的IS管理员将{00010000'(仅为真和假)等8个标志存储到SQL Server binary(2)
。在此格式中,数据的值为“0x1000”。
可以将此二进制文件转换回'00010000'吗?
Convert
,Cast
,Substring
不起作用。
答案 0 :(得分:0)
您的原始数据很可能已丢失。在SQL中将数字转换为二进制时,存储该数据的“空间”数量有限,空间由字段的字节大小决定,在本例中为2.
当数据保存到数据库时会出现问题,使用二进制文件(2)表示数据在保存时被截断,这意味着您在数据中至少丢失了4个“标记”。 (二进制数字开头的4个数字)。
例如,下面显示了SQL存储二进制数6,4和2中数字10010010的内容。
Binary(6) - 0x00000098BD9A
Binary(4) - 0x0098BD9A
Binary(2) - 0xBD9A
正如您所看到的,使用二进制2表示您丢失了数字中的数据。这已经消失,无法使用数据库检索(除非您保存事务日志,如果您有一个DBA存储布尔值作为8位块使用二进制(2)字段,我怀疑你有)。很抱歉这样说,但你根本无法做到你需要做的事情,并且想到使用二进制(2)获得8位数字的人是个好主意,然后没有测试他们的决定是否应该受到指责。
答案 1 :(得分:0)
查询返回十六进制数(0x ... - 十六进制)作为其位掩码
using a = System.Web.Http;
[a.Route("Hello/Jan")]
public IEnumerable<Department> GetDepartmets()
{
var x = pro.GetDept();
return x.ToList();
}
[a.Route("Hello/Jan/{id?}")]
public HttpResponseMessage GetDepartmets(int id)
{
if (id != null)
{
var x = pro.GetDeptById(id);
return Request.CreateResponse(HttpStatusCode.OK, x);
}
else
return Request.CreateResponse(HttpStatusCode.NotFound);
}
答案 2 :(得分:0)
是的,你可以
BINARY(2)
表示2个字节,所以16位
0x3000 =&#39; 0011000000000000&#39;
declare @v int = 0x3000
;WITH
T AS ( SELECT NULL N UNION ALL SELECT NULL ),
N as (
SELECT ROW_NUMBER() OVER (ORDER BY T2.N) N
FROM T T2, T T4, T T8, T T16
),
V AS (
select N, POWER(2,N-1) P, CAST(@v as binary(2)) b2, @v V
from N
),
B AS (
SELECT N, B2, CAST((V/P) % 2 AS char(1)) B
from V
)
SELECT B2, [16]+[15]+[14]+[13]+[12]+[11]+[10]+[9]+[8]+[7]+[6]+[5]+[4]+[3]+[2]+[1] BASE2
FROM B
PIVOT ( MIN(B) FOR N IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]) ) P
输出
B2 BASE2
0x3000 0011000000000000