TSQLQuery - курсор не возвращается из запроса - PullRequest
4 голосов
/ 27 июня 2011

Прямо сейчас я пытаюсь избавиться от какого-то старого поискового кода в программе на Delphi и хочу перенести поиск на sql-сервер, используемый программой. Для этого я создал этот запрос, который очень похож на запрос, который я использую в другой программе на C #.

Запрос отлично работает с использованием SQL Management Studio или из программы на C #, но в Delphi я получаю сообщение об ошибке «Курсор не возвращен из запроса».

Это запрос

DECLARE @SearchString NVARCHAR(MAX);
SET @SearchString = ':Param1';
IF @SearchString = '' SET @SearchString = '%';

--Table for splitted values
DECLARE @SearchItms TABLE
(
Item NVARCHAR(MAX)
)

--Split Operator
DECLARE @SplitOn NVARCHAR(MAX)
SET @SplitOn = ' '; --Split Keywords on space

--Splitting
While (Charindex(@SplitOn,@SearchString)>0)
Begin
    Insert Into @SearchItms (Item)
    Select ('%' + Substring(@SearchString,1,Charindex(@SplitOn,@SearchString)-1) + '%')

    Set @SearchString = Substring(@SearchString,Charindex(@SplitOn,@SearchString)+1,len(@SearchString))
End

--Add last Item
Insert Into @SearchItms (Item) 
Select ('%' + @SearchString + '%')

--Select fitting items
SELECT MyTable.*
FROM MyTable INNER JOIN SecondTable ON (MyTable.Key = SecondTable.Key)
WHERE
NOT EXISTS(
  SELECT * FROM @SearchItms WHERE NOT(
     (OneField IS NOT NULL AND OneField LIKE Item)
  OR (OneDateField IS NOT NULL AND (convert(varchar, OneDateField, 104) LIKE Item) OR (convert(varchar, OneDateField, 114) LIKE Item ) )
  OR (AnotherField IS NOT NULL AND AnotherField LIKE Item)
  OR (LastField IS NOT NULL AND LastField LIKE Item)
  )
)

Одна странная вещь в том, что когда я удаляю

--Add last Item
Insert Into @SearchItms (Item) 
Select ('%' + @SearchString + '%')

Я не получаю сообщение об ошибке «Курсор не возвращен из запроса». Но со строкой поиска, где я получаю только 10 результатов в SQL Management Studio, я получаю все элементы в базе данных в Delphi, как будто поиск ничего не делал.

Это происходит также в простой тестовой программе, где у меня есть только Form, TSQLConnection, TSQLQuery, TDataSetProvider и ClientDataSet.

Может кто-нибудь сказать мне, в чем здесь проблема? Поскольку запрос отлично работает в других средах, я думаю, что он должен быть в порядке.

Большое спасибо за любую помощь.

Ответы [ 2 ]

5 голосов
/ 27 июня 2011

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

Просто добавьте SET NOCOUNT ON; в начало сценария и закройте сценарий с помощью SET NOCOUNT OFF;

Я думаю, что это превосходит сообщение "xx строки произведено" из вставок и, следовательно, позволяет работать без ошибок.

Если вы знаете лучший способ запустить скрипт без ошибок, дайте мне знать.

Спасибо.

2 голосов
/ 27 июня 2011

Это не запрос - это скрипт.Обычно компонент Delphi TQuery может обрабатывать один оператор SQL, а не несколько (сначала у вас есть INSERT, а затем SELECT).Это может быть ВСТАВКА, которая, очевидно, не возвращает курсор.Вы можете попытаться использовать TSQLDataset и посмотреть, может ли он обрабатывать такого рода SQL Server «анонимный блок», или превратить его в хранимую процедуру и вызвать ее из вашей программы Delphi.

...