2011-06-27 44 views
3

現在、私は古い検索コードをdelphiのプログラムで取り除こうとしています。プログラムが使用しているSQLサーバーに検索をプッシュしたいと思います。このため、このクエリを作成しました。これは、別のC#プログラムで使用するクエリと非常によく似ています。TSQLQuery - クエリから返されたカーソルがありません

クエリは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 + '%') 

を削除するとき、私は「カーソルクエリから返されません」というエラーを取得しないこと、です。しかし、SQL Management Studioで10個の結果しか得られない検索文字列では、検索で何もしなかったので、データベース内のすべてのアイテムがDelphiで取得されます。

これは、フォーム、TSQLConnection、TSQLQuery、TDataSetProvider、およびClientDataSetを持つ単純なテストプログラムでも発生します。

誰かが私にこの問題を教えてもらえますか?クエリは他の環境で正常に動作するので、これは問題ありません。

ご協力いただきありがとうございます。

答えて

3

彼のポストでldsandonが述べたように、問題は単純なクエリではなく、完全なスクリプトであるようです。しかし、他のdbExpressユニットではこれを処理できないようだから、私はそれを動作させる方法を見つけました。

ただ、私は、これは挿入から「XX行影響」というメッセージをsurpressesため、エラーなしで実行することが可能になると考え、スクリプトの先頭にSET NOCOUNT ON;を追加し、SET NOCOUNT OFF;

でスクリプトを閉じます。

スクリプトをエラーなく実行するには、私に教えてください。

ありがとうございました。

+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

ストアドプロシージャとして使用するには、実際のストアドプロシージャに変換する必要があります。それはまた、そのように実行する必要があり、毎回それを再解析する必要はありません。 –

関連する問題