Некоторые люди сталкивались с этим разместил ссылки на объяснения побитовых операторов Sql Server или на статьи по нормализации баз данных. Это не ответ на этот вопрос. Я не использую битовые флаги; Я также не заинтересован в создании столбцов в таблице с миллиардами битов. Я храню C# BitArray, который может содержать от нескольких сотен до нескольких тысяч значений в поле SqlServer VARBINARY(MAX). BitArray аналогичен обычному List, за исключением того, что он оптимизирован. Я могу легко восстановить и прочитать этот битовый массив на С#. Мне интересно узнать, есть ли способ прочитать этот битовый массив внутри хранимой процедуры Sql Server и определить, является ли элемент с индексом «x» истинным или ложным. Спасибо всем, кто знает, возможно ли это, и может привести пример того, как это сделать.
Используя C#, я создаю BitArray следующим образом:
Используя C#, я создаю BitArray следующим образом:
р>
var bitArray = new BitArray(2);
Я устанавливаю биты следующим образом:
bitArray[0] = true;
bitArray[1] = false;
... и так далее.
Я отправляю битовый массив в хранимую процедуру SQL Server, где он сохраняется. в столбец VARBINARY(MAX). SqlParameter, который я создаю на C#, выглядит следующим образом:
var byteArray = new byte[2];
bitArray.CopyTo(byteArray,0);
new SqlParameter("@BitArray", SqlDbType.VarBinary) { Size=-1, Value = byteArray }
В моей хранимой процедуре я сохраняю @BitArray в столбце VARBINARY(MAX). После сохранения я могу получить значение обратно из таблицы в приложении C# и прочитать отдельные элементы true/false из восстановленного битового массива. Все работает отлично.
Я открываю SqlDataReader с помощью
SELECT MyByteArray FROM MyTable WHERE Id = @MyId
Я получаю массив байтов в устройстве чтения данных и преобразую его в массив битов:
Byte[] myByteArray = (byte[])reader.GetValue(0);
BitArray myReconstitutedBitArray = new BitArray(myByteArray)
Затем я могу прочитать данные из myReconstitutedBitArray и убедиться, что все работает нормально:
- myReconstitutedBitArray[0 ] = true.
- myReconstitutedBitArray[1] = false.
Проблема в том, что в SQL Server мне нужно иметь возможность читать из MyTable.MyByteArray и видеть отдельные значения true/false, но я не могу. Все возвращает ложь. Я использую SQL Server 2022, поэтому использую метод GET_BIT, но он для всех случаев возвращает false. Независимо от того, что я помещаю в позицию индекса, оно возвращает false. Я знаю, что поле имеет правильные значения, поскольку я могу прочитать их на C#.
Как я могу прочитать эти значения в SQL Server?
Каждый такой вызов возвращает false, хотя я знаю, что этот бит равен true, и вижу истинное значение в C#:
SELECT GET_BIT(MyByteArray, 0) FROM MyTable WHERE MyId = @MyId
SELECT GET_BIT(MyByteArray, 1) FROM MyTable WHERE MyId = @MyId
Подробнее здесь: https://stackoverflow.com/questions/783 ... max-column