-1

私は自分が取り組んでいるこの小さなプロジェクトを持っていて、特定のことをしたいのに、うまくいく解決策を見つけられないような部分にたどり着きました。基本的に、モバイルアプリに使用するWebサービスをVisual Studioで作成しましたが、複数のユーザーからクライアントを取得できる新しい機能を追加したいと思いました。これを行うには、値の配列をWHERE IN句に渡すことができる必要があります。これは、ほとんど不可能であることがわかっていますが、私が読んだ他のソリューション(プロセスの実際の例はありません)配列値のテーブルを作成してから、WHERE IN(SELECT * from TEMPTABLE)タイプのシナリオを作成します。

だから、これは私が立ち往生しているところです、SQLステートメントに値の配列を渡して、それらの値の一時テーブル(1から30の値の範囲)を作成して、他のクエリを実行できるようにするにはどうすればよいですか?それらの値。私が見たほとんどの例では、一時テーブルに値がハードコーディングされていますが、そのテーブルにランダムな量の値を渡すことができる必要があるため、コンマを含む1つの文字列として渡す方が簡単な場合は、それらを特定の形式で渡す必要がある場合は、Webサービスを呼び出す前にiOS側でもそれを行うことができますが、この動的なタイプのテーブルを実行して次の部分に進む方法がわからないようです。 。

編集(コメントに基づいていくつかの情報を追加)

したがって、システムと目的に関するいくつかの背景情報は、私が行っていることをよりよく理解するのに役立ちます。私が取り組んでいるのは既存のWebアプリケーションのモバイルアプリケーションポートであるため、データベースは既存のテーブルとデータを備えたSQL Server(2008)です。たとえば、私が使用できる2つのテーブルは、エージェントテーブル(従業員用)と顧客テーブル(クライアント用)です。そのため、場合によっては、互いのクライアントを表示できるチームがあります。したがって、通常、エージェントのグループからクライアントのリストを取得する場合は、WHERE INステートメントを使用しますが、Webサービスの場合、担当者は少数のチームのみを表示する必要があるため、そのグループを変数として取得する必要があります。メンバーまたはすべてのチームメンバー(これはiOSアプリで設定されたオプションになります)。

私は実際に機能するコードを持っていません、そして私が知っていることのほとんどは実際には機能しないので、私がやりたいことを説明するためにいくつかの擬似コードを置きます。最初、私はこれができると思っていました:

SELECT C.first_name + ' ' + C.last_name as [Client Name]
FROM dbo.agent as A INNER JOIN
dbo.contact as C ON C.agent_id = A.id
WHERE (A.id IN (@RepList))

この例では、@ RepListは、iOSアプリからWebサービスに渡される文字列であり、アプリケーション内で選択されたすべてのIDが含まれています。これを調べたところ、WHERE INステートメントに変数を含めることはできませんが、変数を使用して一時テーブルを作成すると、次のように参照できることを読みました。

CREATE TABLE #TempTable (TempID VARCHAR(MAX))
INSERT INTO #TempTable (TempID)
VALUES (@RepList)

SELECT C.first_name + ' ' + C.last_name AS [Client Name]
FROM dbo.agent AS A INNER JOIN
                    dbo.contact AS C ON A.id = C.agent_id
WHERE (A.id IN (SELECT #TempTable.* FROM #TempTable))

繰り返しになりますが、@ RepListは、iOSアプリケーションからこのクエリを実行するWebサービスに渡されるIDのリストになります。値のリストを変数としてTempTableに渡す方法がわからないため、ここで行き詰まります。これは、Visual Studioで問題になる可能性があります(SQLクエリデザイナで問題が発生し、Webサービスで機能する特定の処理を受け入れないため)が、これが正しい形式であることを確認したいと思います。したがって、先に進む前に。最終的に、WebServiceは、その人が見たいエージェントの数に基づいてクライアントのリストを返すことができる必要があります(これは、1エージェントから20エージェントの範囲です)。

4

1 に答える 1

0

SQL Server 2008とVS2010を使用しているため、おそらく最善の解決策はテーブル値パラメーターを使用することです。このリンク(ここ)は、.Netクライアントからそれらを使用する方法を説明しています。

基本的な考え方は、WebサービスコードがSQL Serverでプロシージャ、関数、またはパラメータ化されたクエリを呼び出すことです。ここで、パラメータの1つは値のテーブルです。次に、SQLコードは、一時テーブルではなく、そのテーブル値パラメーターをソース一致テーブルとして使用します。

于 2012-08-15T17:46:40.973 に答える