Преобразование массива байтов в строку с помощью TransactSQL

Мы храним строковые значения в базе данных, используя тип 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;
}

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

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


person Oscar    schedule 25.01.2010    source источник


Ответы (3)


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

Encoding.Default.GetBytes("a");

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

create table #sample (content varbinary(max));
insert into  #sample values (0x61)
select cast(content as varchar) from #sample
person Rubens Farias    schedule 25.01.2010
comment
Спасибо, Рубенс, но эта техника используется для другого фреймворка (Entlib Contrib entlibcontrib.codeplex.com) и не может измениться Это. Они используют его, потому что тогда они могут хранить больше типов: целые числа, строки, изображения и т. д. и т. д., и мы хотим (только когда тип является строкой) преобразовать эти сохраненные значения в строку - person Oscar; 25.01.2010
comment
Оскар, BitConverter.GetBytes может быть полезен? - person Rubens Farias; 25.01.2010
comment
но это метод из .Net framework, не так ли? Я хочу использовать только SqlConsole. Я программирую его, используя функции CLR Sql, согласно Kleinux. Спасибо еще раз. - person Oscar; 25.01.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;
  }
}
person Kleinux    schedule 25.01.2010
comment
Вы правы, я не помнил об этом... Пойду посмотрю. Спасибо!! - person Oscar; 25.01.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
person Pent Ploompuu    schedule 25.01.2010
comment
Спасибо, Пент, но эта техника используется для другого фреймворка (Entlib Contrib entlibcontrib.codeplex.com) и не может измениться Это. Они используют его, потому что тогда они могут хранить больше типов: целые числа, строки, изображения и т. д. и т. д., и мы хотим (только когда тип является строкой) преобразовать эти сохраненные значения в строку - person Oscar; 25.01.2010
comment
Затем вы можете использовать пользовательские функции CLR, предложенные Kleinux. - person Pent Ploompuu; 25.01.2010