Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当递增varbinary时,会导致TSQL混乱_Sql_Sql Server - Fatal编程技术网

当递增varbinary时,会导致TSQL混乱

当递增varbinary时,会导致TSQL混乱,sql,sql-server,Sql,Sql Server,但是我在寻找一个结果,结果是0x000000003B65407,我如何通过在二进制值上加1来得到这个结果。VARBINARY在T-SQL中更像是一个二进制字符串数据类型,因此+操作符将两个值连接起来,而不是执行数学加法。这是有道理的,因为SQL Server不知道您是否在该字段中存储整数、浮点或jpeg图像 在您的情况下,由于有8个字节,您可以: DECLARE @V AS VARBINARY(8) SET @V = 0x000000003B654036; SELECT @V as 'Befor

但是我在寻找一个结果,结果是0x000000003B65407,我如何通过在二进制值上加1来得到这个结果。

VARBINARY
在T-SQL中更像是一个二进制字符串数据类型,因此
+
操作符将两个值连接起来,而不是执行数学加法。这是有道理的,因为SQL Server不知道您是否在该字段中存储整数、浮点或jpeg图像

在您的情况下,由于有8个字节,您可以:

DECLARE @V AS VARBINARY(8)
SET @V = 0x000000003B654036;
SELECT @V as 'Before'
Set @V = @V+0x0000000000000001;
SELECT @V as 'After'

Before: 0x000000003B654036
After: 0x000000003B654036


Expanding the varbinary result to a larger value I see where the 0x0000000000000001 is going

DECLARE @V AS VARBINARY(8);
DECLARE @R AS VARBINARY(max);
SET @V = 0x000000003B654036;
SELECT @V as 'Before';
SET @R = @V +0x0000000000000001;
SELECT @R as 'After' ;

Before: 0x000000003B654036
After: 0x000000003B6540360000000000000001
如果超过8个字节,则必须编写自己的加法代码。在这种情况下,我会考虑CLR。< /P>
如果所有的值都是8字节长的,那么您可能还需要考虑使用
BINARY(8)
而不是
VARBINARY(8)
。这将在磁盘上节省一点空间,因为SQL Server不再需要存储每行的长度。

奇怪的结果:)强制转换和任何可能的截断是否会导致SQL Server之间的值不同。。。注意msdn中的varbinary和binary类型。。。任何数据类型和二进制数据类型之间的转换都不能保证在SQL Server版本之间是相同的。这是有风险的。但是,对于BIGINT数据类型,只要您在64位或更高的英特尔处理器平台上执行,这种情况就不太可能改变。如果您需要100%经得起未来考验(而不是仅仅99.9999%),那么您必须自己进行一次一字节的计算,或者最好使用CLR数据类型并用C#处理计算。我个人会将此测试添加到我的自动化单元测试套件中,并使用CAST。如果它坏了,测试会告诉我的。只是说清楚,你需要8次测试。更改的是可能导致溢出操作出错的字节顺序。类似0x0000f000+0x000011000的结果是0x00000001而不是0x00010000。此方法解决了问题。。。完美的谢谢我只是使用了铸造,如果价值观结束了,我们会处理它。
DECLARE @V AS VARBINARY(8)
DECLARE @W AS VARBINARY(8)
SET @V = 0x000000003B654036;
SELECT @V as 'Before'
Set @W = 0x0000000000000001;
SET @V = CAST( CAST(@V AS BIGINT) + CAST(@W AS BIGINT) AS VARBINARY(8));
SELECT @V as 'After'