我正在处理一个具有varbinary(max)类型的列的SQL表。我打算通过存储过程在其中存储两个Int16值。我将在C#代码中使用此列值,所以我希望我能做一些事情,比如'在前8位中保存一个值,在后8位中保存第二个值',等等。我探索了SQL按位运算符但是无法总结我如何做到这一点。
如果我能获得任何指示或链接来阅读,我将非常感激。
答案 0 :(得分:1)
您可以将存储过程参数转换为二进制并将它们连接起来:
DECLARE @T TABLE (BinaryValue VARBINARY(MAX))
DECLARE @Int1 SMALLINT
DECLARE @Int2 SMALLINT
SELECT
@Int1 = 32767,
@Int2 = -32768
INSERT @T (BinaryValue)
SELECT CAST(ISNULL(@Int1,0) AS VARBINARY(2)) + CAST(ISNULL(@Int2,0) AS VARBINARY(2))
SELECT
BinaryValue,
Int1 = CAST(SUBSTRING(BinaryValue, 1, 2) AS SMALLINT) ,
Int2 = CAST(SUBSTRING(BinaryValue, 3, 2) AS SMALLINT)
FROM
@T
答案 1 :(得分:0)
要存储2个Int16
值,您显然需要总共32位或4个字节。下面是一些C#代码,它们向您展示如何将2 Int16
值转换为字节数组,然后使用位移来反过来。
我意识到您可能需要在存储过程中执行此操作。但是如果你研究简单的位移逻辑,你就不会很难将逻辑转换成你的程序。
希望这会让你开始:
public static void Main(string[] args)
{
Int16 value1 = 12345;
Int16 value2 = 31210;
byte[] bytes = new byte[4];
bytes[0] = (byte)(value1 >> 8);
bytes[1] = (byte)value1;
bytes[2] = (byte)(value2 >> 8);
bytes[3] = (byte)value2;
// store the byte array in your db column.
// Now let's pretend we're reading the byte array and converting back to our numbers.
Int16 decodedValue1 = (Int16)((bytes[0] << 8) | bytes[1]);
Int16 decodedValue2 = (Int16)((bytes[2] << 8) | bytes[3]);
Console.WriteLine(decodedValue1); // prints 12345
Console.WriteLine(decodedValue2); // prints 31210
}
通过使用内置的BitConverter
类,这是另一种在C#中没有显式位移的方法:
public static void Main(string[] args)
{
Int16 value1 = 12345;
Int16 value2 = 31210;
byte[] bytes = new byte[4];
Array.Copy(BitConverter.GetBytes(value1), 0, bytes, 0, 2);
Array.Copy(BitConverter.GetBytes(value2), 0, bytes, 2, 2);
// store the byte array in your db column.
// Now let's pretend we're reading the byte array and converting back to our numbers.
Int16 decodedValue1 = BitConverter.ToInt16(bytes, 0);
Int16 decodedValue2 = BitConverter.ToInt16(bytes, 2);
Console.WriteLine(decodedValue1); // prints 12345
Console.WriteLine(decodedValue2); // prints 31210
}