2011-06-27 87 views
3

現在,我想擺脫一些delphi程序中的舊搜索代碼,並且我想將搜索推到程序正在使用的sql-server上。爲此,我創建了這個查詢,這與我在不同的C#程序中使用的查詢非常相似。TSQLQuery - 遊標不是從查詢返回

該查詢工作得很好,使用SQL管理工作室或從C#程序,但與德爾福我得到一個「遊標不查詢返回」錯誤。

這是查詢

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。

有人可以告訴我最新的問題嗎?由於查詢在其他環境中正常工作,我認爲它應該是可以的。

非常感謝您的幫助。

回答

3

由於ldsandon在他的文章中提到,問題似乎是,它不是一個簡單的查詢,而是一個完整的腳本。但由於其他dbExpress單位似乎無法處理這個問題,我找到了一種方法來使它工作。

只需添加一個SET NOCOUNT ON;到腳本的開頭,並關閉所有與SET NOCOUNT OFF;

劇本我覺得這surpresses從嵌入式「XX行影響」的消息,因此能夠無差錯運行。

如果你知道一個更好的方式來運行腳本沒有錯誤,讓我知道。

謝謝。

+0

是的,開始相同的答案,但你寫得更快:P – Rodrigo

+0

我有同樣的問題,簡單的「DELETE FROM WHERE id =:id」 –

2

這不是查詢 - 這是一個腳本。通常,Delphi TQuery組件可以處理單個SQL語句,而不是多個(您先有INSERT,然後是SELECT)。它可能是INSERT,顯然不返回遊標。您可以嘗試使用TSQLDataset並查看它是否可以處理這種SQL Server「匿名塊」,或者將其轉換爲存儲過程並從Delphi程序中調用它。

+0

看起來這個問題實際上是一個腳本而不是單個查詢。不幸的是,TSQLDataSet和帶有TStoredProc的存儲過程也無法處理它。但是我找到了一個解決方案,我將以答案形式發佈 – Marks

+0

要將其用作存儲過程,您必須將其轉換爲真實的存儲過程。這種方式也應該更具性能,無需每次重新解析。 – 2011-06-27 12:00:48