4

現在、デルファイ プログラムの古い検索コードを取り除こうとしています。プログラムが使用している 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)
  )
)

奇妙なことの1つは、削除すると

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

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

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

誰かがここで何が問題なのか教えてもらえますか? 他の環境ではクエリは問題なく動作するので、問題ないと思います。

助けてくれてありがとう。

4

2 に答える 2

5

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

スクリプトの先頭にa を追加しSET NOCOUNT ON;、スクリプトを閉じますSET NOCOUNT OFF;

これにより、挿入からの「xx 行が影響を受けました」というメッセージが抑制されるため、エラーなしで実行できるようになると思います。

エラーなしでスクリプトを実行するためのより良い方法を知っている場合は、お知らせください。

ありがとう。

于 2011-06-27T10:15:32.637 に答える
2

これはクエリではなく、スクリプトです。通常、Delphi TQuery コンポーネントは、複数の SQL ステートメントではなく、単一の SQL ステートメントを処理できます (最初に INSERT があり、次に SELECT があります)。明らかにカーソルを返さないのは INSERT かもしれません。TSQLDataset を使用して、そのような種類の SQL Server の「匿名ブロック」を処理できるかどうかを確認するか、それをストアド プロシージャに変換して Delphi プログラムから呼び出すことができます。

于 2011-06-27T09:56:45.993 に答える