Не уверенный в получении IntPtr к массиву, но можно скопировать данные для использования с неуправляемым кодом при помощи Mashal. Копия:
IntPtr unmanagedPointer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, unmanagedPointer, bytes.Length);
// Call unmanaged code
Marshal.FreeHGlobal(unmanagedPointer);
, Кроме того, Вы могли объявить структуру с одним свойством и затем использовать Маршала. PtrToStructure, но это все еще потребовало бы выделяющей неуправляемой памяти.
Редактирование: кроме того, как Tyalis указал, можно также использовать , зафиксировал , если небезопасный код является опцией для Вас
Предполагая, что у вас есть поля в этом формате:
00Data0007
000000Data0011
0000Data0015
, вы можете сделать следующее:
Создать вычисляемый столбец: ndata AS RIGHT (REVERSE (data), LEN (data) - 4)
Это преобразует ваши столбцы в следующие:
ataD00
ataD000000
ataD0000
Создайте индекс для этого столбца
Выполните этот запрос для поиска строки Data
:
SELECT *
ИЗ mytable
ГДЕ ndata LIKE N'ataD% '
И ПОДСТРОКА (ndata, LEN (N'ataD ') + 1, LEN (ndata)) = REPLICATE (' 0 ', LEN (ndata) - LEN (' ataD '))
Первое условие будет использовать индекс для грубой фильтрации.
Второе гарантирует, что все начальные символы (которые стали конечными символами в вычисляемом столбце) не что иное, как нули.
См. Эту запись в моем блог для подробностей о производительности:
Обновление
Если вам нужен только индекс для SUBSTRING
без изменения схемы, создание представления вариант.
CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM mytable
CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)
SELECT id, data
FROM v_substring75
WHERE substring75 = '12345'
Добавьте вычисляемый столбец в свою таблицу и создайте индекс для этого столбца.
ALTER TABLE MyTable
Add Column CodeHead As LEFT(Code,Len(Code)-4)
Затем создайте индекс для этого.
CREATE INDEX CodeHeadIdx ON MyTable.CodeHead
Можете ли вы перефразировать критерии фильтрации в терминах LIKE 'something%' утверждения? (Это применимо к индексу)
Измените столбец на два столбца - данные, которые вы объединяете, и дополнительные 4 символа. Использование частей колонны замедляет работу, как вы видели