使用TransactSQL将Byte Array转换为字符串

时间:2010-01-25 13:14:41

标签: c# sql-server tsql bytearray

我们使用c#和BinaryFormatter使用varBinary类型在数据库中存储字符串值。我们转换为字节数组然后保存到DataBase

public static byte[] ToBytes(stringvalue)
{
  if (value == null)
    return null;

  byte[] inMemoryBytes;
  using (MemoryStream inMemoryData = new MemoryStream())
  {
    new BinaryFormatter().Serialize(inMemoryData, value);
    inMemoryBytes = inMemoryData.ToArray();
  }

  return inMemoryBytes;
}

好的,所以如果我们保存char“a”,我们可以在数据库中看到“0x0001000000FFFFFFFF0100000000000000060100000001610B”。我们可以检索数据并再次转换为字符串。
我们是否可以仅使用transact SQL将此二进制值(“0x0001000000FFFFFFFF0100000000000000060100000001610B”)转换为char(“a”)(因此我们可以从sql server控制台进行修改,插入和比较)?

非常感谢。

3 个答案:

答案 0 :(得分:2)

你可以使用更简单的东西,如

Encoding.Default.GetBytes("a");

这将返回“61”并且可以更容易地转换为varchar,只需运行此:

create table #sample (content varbinary(max));
insert into  #sample values (0x61)
select cast(content as varchar) from #sample

答案 1 :(得分:2)

我建议使用http://msdn.microsoft.com/en-us/magazine/cc163473.aspx描述的方法来使用.NET正则表达式库。特别是CLR用户定义函数的部分。您可以简单地使用BinaryFormatter来反序列化您的字节数组。

[SqlFunction]
public static string ToStringFromBytes(byte[] value) 
{ if (value == null) return null;

  using (MemoryStream inMemoryData = new MemoryStream(value))
  {
    return new BinaryFormatter().Deserialize(inMemoryData) as string;
  }
}

答案 2 :(得分:0)

为什么不能将原始字符串存储在nvarchar(MAX)类型列中? 如果必须使用varbinary类型列,那么至少使用System.Text.Encoding类进行转换 - 然后你也可以解码sql中的字符串:

public static byte[] ToBytes(string value)
{
  if (value == null) return null;
  return System.Text.Encoding.Unicode.GetBytes(value);
}

然后像这样使用它:

select cast(VarBinaryField as nvarchar(max)) from SomeTable