Есть ли способ, чтобы GUID был частью самого SQL-запроса без использования параметра?
Позвольте мне объяснить, что именно я пытаюсь сделать и почему. Я работаю с существующим приложением, которое использует ADO.Net для создания и подключения к базе данных SQLite. Нынешняя структура базы данных и метод запроса к ней ужасны. Я нахожусь в середине редизайна того, как это работает фундаментально. Однако это не то, что можно сделать быстро. Пока этот редизайн завершается, у меня возникла ситуация, требующая временного решения. Напомню, что причина первоначальной реализации кода неясна и, похоже, была создана кем-то, у кого было мало знаний о базах данных. Рефакторинг всей базы данных, чтобы не нуждаться в этой ситуации, является окончательным решением, но пока я просто ищу работу в рамках существующей структуры.
Дизайн базы данных основан на GUID для уникальной идентификации строк. Чтобы выполнить отфильтрованное извлечение данных, система динамически создает команду, содержащую предложение IN, в котором перечислены идентификаторы GUID, которые необходимо получить. Прямо сейчас идентификаторы GUID вставляются в запрос с помощью параметра с типом GUID, поэтому запрос будет выглядеть так:
SELECT * FROM data_table WHERE guid_col IN( ?, ?, ?, ?)
Проблема возникает, когда мне нужно получить относительно большой объем информации. SQLite имеет ограничение в 1000 параметров в одном запросе. Если мне нужно передать более 1000 GUID для поиска, запрос просто сломается. При построении приведенной выше строки она перебирает список GUID, чтобы вставить вопросительные знаки и создать параметры. Мое временное решение проблемы должно было заключаться в том, чтобы значение GUID было вставлено непосредственно туда, где в настоящее время находятся вопросительные знаки, и отказалось от параметров в запросе. В конце концов, это своего рода использование параметров для целей, для которых они не нужны.
Проблема с этим «решением» заключается в том, что я не могу заставить GUID соответствовать данным в столбце, т. е. запрос всегда возвращает значение null. Я понимаю, что идентификаторы GUID не являются родным типом для SQLite, и под ними они фактически представлены как BLOB (да, я уверен, что мы используем BLOB, а не строковое представление). Тем не менее, мне не удалось заставить запрос выполняться правильно.
До сих пор я пробовал все следующее:
Я попытался вызвать ToString() для GUID, поэтому запрос выглядит так:
SELECT * FROM data_table WHERE guid_col IN
( 'b5080d4e-37c3-4286-9c3a-413e8c367f36', 'aa0ff789-3ce9-4552-9840-5ed4d73c1e2c')
Я попытался вызвать ToString ("N") для GUID, поэтому запрос выглядит так:
SELECT * FROM data_table WHERE guid_col IN
( 'b5080d4e37c342869c3a413e8c367f36', 'aa0ff7893ce9455298405ed4d73c1e2c')
Я попытался вызвать ToString ("B") для GUID, поэтому запрос выглядит так:
SELECT * FROM data_table WHERE guid_col IN
( '{b5080d4e-37c3-4286-9c3a-413e8c367f36}',
'{aa0ff789-3ce9-4552-9840-5ed4d73c1e2c}')
Я попытался вызвать ToByteArray() для GUID и поместить результат в запрос, добавив каждый байт в строку, вызывающую ToString("X") для каждого байта, чтобы запрос выглядел как
SELECT * FROM data_table WHERE guid_col IN ('4ED8B5C33786429C3A413E8C367F36', '89F7FAAE93C524598405ED4D73C1E2C')
При чтении документации SQLite я прочитал следующее: «BLOB-литералы — это строковые литералы, содержащие шестнадцатеричные данные, которым предшествует один символ «x» или «X». Если я попытаюсь применить это к моему запросу, это будет выглядеть так:
SELECT * FROM data_table WHERE guid_col IN
( x'4ED8B5C33786429C3A413E8C367F36', x'89F7FAAE93C524598405ED4D73C1E2C')
Я получаю сообщение об ошибке, говорящее, что «x» не является распознанным символом.
Можно ли получить GUID в строке запроса без использования параметра?