存储过程,并从两个几乎相同的视图中进行选择

时间:2012-07-24 07:50:32

标签: sql-server stored-procedures view

我有两个视图返回相同的列,但返回不同的行。

我正在创建一个使用这些视图的存储过程。存储过程很大,并在列中搜索匹配的行。

现在,我的愿望是:如果我收到一个值为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密切相关,并且变量views \ tables问题遍布stackoverflow,但我认为,因为我的两个表实际上是在存储过程中,这比hack更多功能...

问题是:有没有办法设置静态变量,所以这个选择可以根据给定的参数询问不同的视图?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)

答案 2 :(得分:0)

你可以放一个简单的if else循环

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