TSQLQuery - 未从查询返回游标

时间:2011-06-27 09:17:21

标签: delphi tsql dbexpress

现在,我正试图在delphi程序中删除一些旧的搜索代码,我想将搜索推送到程序正在使用的sql-server。为此,我创建了这个查询,这与我在不同的C#程序中使用的查询非常相似。

使用SQL Management Studio或C#程序查询工作得很好,但是使用Delphi我得到一个“Cursor not from query from”错误。

这是查询

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 + '%')

我没有收到“游标未从查询中返回”错误。但是使用搜索字符串,我在SQL Management Studio中只得到10个结果,我在Delphi中获取数据库中的所有项目,就像搜索没有做任何事情一样。

这也发生在一个简单的测试程序中,我只有一个Form,一个TSQLConnection,TSQLQuery,TDataSetProvider和一个ClientDataSet。

有人能告诉我这里的问题是什么吗?由于查询在其他环境中工作正常,我认为应该没问题。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

正如ldsandon在帖子中提到的,问题似乎是,它不是一个简单的查询,而是一个完整的脚本。但由于其他dbExpress单元似乎无法处理这个问题,我找到了一种方法使其工作。

只需在脚本的开头添加SET NOCOUNT ON;,然后使用SET NOCOUNT OFF;

关闭脚本

我认为这会压缩来自插入的'xx rows affected'消息,因此可以无误地运行。

如果你知道更好的方法来运行脚本而没有错误,请告诉我。

感谢。

答案 1 :(得分:2)

这不是查询 - 这是一个脚本。通常Delphi TQuery组件可以处理单个SQL语句,而不是多个SQL语句(首先是INSERT,然后是SELECT)。它可能是INSERT,显然不会返回游标。您可以尝试使用TSQLDataset并查看它是否可以处理这种SQL Server“匿名块”,或者将其转换为存储过程并从Delphi程序中调用它。