Преобразование байтового массива в строку с использованием TransactSQL - PullRequest
5 голосов
/ 25 января 2010

Мы храним строковые значения в базе данных, используя тип varBinary, используя c # и BinaryFormatter. Мы преобразуем в байтовый массив, а затем сохраняем в базу данных

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;
}

ОК, поэтому, если мы сохраним символ «а», мы увидим «0x0001000000FFFFFFFF0100000000000000060100000001610B» в базе данных. После этого мы сможем извлечь данные и снова преобразовать их в строку.
Можем ли мы преобразовать это двоичное значение ("0x0001000000FFFFFFFF0100000000000000060100000001610B") в char ("a") только с использованием транзакционного SQL (поэтому мы можем выполнять модификации, вставки, сравнения из консоли сервера SQL)?

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 25 января 2010

Я бы предложил использовать описанный метод 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 голосов
/ 25 января 2010

Вы можете использовать что-то более простое, как

Encoding.Default.GetBytes("a");

Это вернет "61" и может быть легче переведено в varchar, просто запустив это:

create table #sample (content varbinary(max));
insert into  #sample values (0x61)
select cast(content as varchar) from #sample
0 голосов
/ 25 января 2010

Почему вы не можете просто сохранить исходную строку в столбце типа 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
...