2

同じ列を返すが、行が異なる2つのビューがあります。

これらのビューを使用するストアドプロシージャを作成しています。ストアドプロシージャは大きく、列全体で一致する行を検索します。

さて、私の願いはこれです。値が0のビットパラメータを受け取った場合は、あるビューから情報を取得する必要があります。パラメータが1の場合は、別のビューから情報を取得する必要があります。

動的SQLは悪い考えであり、私が使用しているストアドプロシージャはすでに非常に複雑であることを理解しました。動的になるように再作成することはできません。

私はこれを行うことが不可能であることについても読みました:

select * from @table

テーブル名は静的である必要があり、exに渡されないためです。コードによるストアドプロシージャ。

私が達成しようとしていることは次のようなものです:

SELECT TOP(@top) subtaskid,activityid FROM 
(CASE WHEN @allProjects=1 THEN view_project_all ELSE view_project_mine) v

ただし、「キーワード'CASE'の近くの構文が正しくありません。この質問は動的SQLに密接に関連していることを認識しています。また、スタックオーバーフロー全体で変数ビュー\テーブルの質問がありますが、2つのテーブルが実際にストアドにあるためだと思います。手順これはハックよりも機能的です...

質問はこれです:与えられたパラメータに従って、この1つの選択が異なるビューを要求できるように静的変数を設定する方法はありますか?

4

3 に答える 3

3

簡単な方法:

IF @allProjects = 1
BEGIN
    SELECT TOP(@top) subtaskid,activityid FROM view_project_all v;
END
ELSE
    SELECT TOP(@top) subtaskid,activityid FROM view_project_mine v;
BEGIN
END

必要に応じて、これらのテーブルを結合するビューを作成し、そのビューに対してクエリを実行できます。

SELECT subtaskid, activityid, 1 as allProjects FROM view_project_all
UNION ALL
SELECT subtaskid, activityid, 0 as allProjects FROM view_project_mine

それに対してクエリを実行します。

SELECT TOP(@top) subtaskid,activityid FROM view_project_mine_all_union v WHERE allProjects = @allProjects;
于 2012-07-24T07:54:31.210 に答える
2

ifを使用できます

 if @allProjects = 1
       SELECT subtaskid,activityid FROM view_all_projects
 else
       SELECT subtaskid,activityid FROM view_project_mine

これが問題を大幅に単純化しすぎている場合は、結果を一時的なテーブルに入れることができます。

または、プロジェクトビューを調整して、プロジェクトオーナーが含まれるようにし、試してみることができます。

 SELECT subtaskid, activityId FROM view_projects
 WHERE (projectowner = USER) OR (@allprojects=1)
于 2012-07-24T07:55:13.010 に答える
0

単純なifelseループを配置できます

If @allProjects = 1
begin 
SELECT TOP(@top) subtaskid,activityid from view_project_all
end
else
begin 
SELECT TOP(@top) subtaskid,activityid from view_project_mine
end
于 2012-07-24T09:05:47.773 に答える