MS Server Management Studioで実行すると機能し、C#から送信すると機能するが、Java(1.6、sqljdbc4.jarを使用)から送信すると機能しないSQLステートメントがあります。
基本的な問題は、テーブル変数を選択することのようです。最初のコメントのフォローアップとして、簡単な例を使用してこの質問を完全に書き直し、何が機能し、何が機能しないかを示しました。
次のクエリ:
DECLARE @IsLoadRaw as INT = ?
DECLARE @PrimaryID as varchar(1000) = ?
--Declare temporary table to hold message IDs and fill according to Primary ID.
DECLARE @MessageIDs TABLE ( MessageID BIGINT )
SELECT MessageID FROM Messages WHERE PrimaryID = @PrimaryID
SQL Management Studioと、Javaから送信された場合の両方で機能します。どちらの場合も、2つのMessageID(テストに使用している特定のPrimaryIDに対して正しい)を含む結果セットを返します。
次のクエリ:
DECLARE @IsLoadRaw as INT = ?
DECLARE @PrimaryID as varchar(1000) = ?
--Declare temporary table to hold message IDs and fill according to Primary ID.
DECLARE @MessageIDs TABLE ( MessageID BIGINT );
INSERT @MessageIDs SELECT MessageID FROM Messages WHERE PrimaryID = @PrimaryID;
SELECT * FROM @MessageIDs;
SQL Management Studioで動作し、同じ2つのMessageIDを持つ結果セットを返します。Javaから送信された場合、結果セットは返されません。
@MessageIDsを使用する完全なステートメントは、C#からADO.NET経由で送信された場合に機能します。ここの2番目のサンプルも同様に機能すると思います。この問題はJavaに限定されており、テーブル変数の使用に関連しているようです。コードは正しく表示され、SQL Management Studioで実行されるため、これをデバッグする方法に戸惑います。
これがJavaから機能しない理由はありますか?Javaから送信されたときに、サーバーがこのクエリで何を行っているかを理解するために、どのツールを使用できますか?