ASP.Net и SQL - PullRequest
       40

ASP.Net и SQL

1 голос
/ 10 сентября 2009

Я занимаюсь разработкой приложения asp.net, в котором пользователь вводит набор номеров документов в таблицу Excel, и мое приложение должно выполнить поиск определенных записей в базе данных и вернуть записи, содержащие значение, которое было введено в качестве ввода.

Например, если номер документа, который был задан в качестве ввода, равен «2245678»

В базе данных поле, содержащее значение, будет иметь формат LibraryName: 2245678: Version1, из-за того, как хранится в базе данных, я должен был поместить подобный запрос как

Select from table where documentnumber like '%2245678%'

Этот набор операторов SQL должен повторяться для всех номеров документов, которые передаются в качестве входных данных в таблицу Excel. Это действительно вызовет проблемы с производительностью.

Есть ли другой способ сделать это?

Ответы [ 3 ]

1 голос
/ 10 сентября 2009

Вы не указываете своего провайдера базы данных, но Полнотекстовое индексирование в этих полях может быть тем, что вам нужно.

Примечание: я второй комментарий JBKing, если это подходит для вашего приложения.

0 голосов
/ 10 сентября 2009

Хорошо, если его так хранить, и вы можете от души сказать, что у вас есть

Поле1: Поле2: Поле3, тогда вы можете использовать подстроку и символьную строку вместо %%. Я понятия не имею, улучшается ли его производительность, но я предполагаю, что это произойдет, так как затраты ресурсов на поиск индекса одного символа меньше, чем на последовательное сканирование всей строки для вашего выражения

Так что это близкая вам аппроксимация в SQL Server 2005

SELECT SUBSTRING (SUBSTRING ('field1: field2: field3', CHARINDEX (':', 'field1: field2: field3') + 1, 999), 1, CHARINDEX (':', SUBSTRING ('field1: field2 : field3 ', CHARINDEX (': ',' field1: field2: field3 ') + 1, 999)) - 1)

Есть один способ:)

0 голосов
/ 10 сентября 2009

Поскольку вы не можете изменить схему, посмотрите, работает ли она лучше:

Select * 
from table 
where substring (documentnumber , charindex(':', documentnumber ) + 1, charindex(':', documentnumber , charindex(':', documentnumber ) + 1) - charindex(':', documentnumber ) - 1) = '2245678'

Edit:

Если имеется ограниченное (небольшое) количество имен библиотек, вы можете добиться лучшей производительности при выполнении жестко закодированного запроса:

Select * 
from table
where documentnumber like 'LibraryName1:' + '2245678' + ':%'
    or documentnumber like 'LibraryName2:' + '2245678' + ':%'
    or documentnumber like 'LibraryName3:' + '2245678' + ':%'

Если поле documentnumber фактически проиндексировано, это должно работать довольно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...