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

Sql server 存储过程,并从两个几乎相同的视图中进行选择,sql-server,stored-procedures,view,Sql Server,Stored Procedures,View,我有两个返回相同列但不同行的视图 我正在创建一个使用这些视图的存储过程。存储过程很大,会跨列搜索匹配的行 现在,我的愿望是:如果我收到一个值为0的位参数,那么我应该从一个视图获取信息,如果参数为1,那么我应该从另一个视图获取信息 我知道动态SQL不是一个好主意,我正在使用的存储过程已经相当复杂了。将其重新创建为动态不是一个选项 我也读到过这样做是不可能的: select * from @table 因为表名应该是静态的,而不是通过代码传递给存储过程 我试图实现的是这样的目标: SELECT T

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

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

现在,我的愿望是:如果我收到一个值为0的位参数,那么我应该从一个视图获取信息,如果参数为1,那么我应该从另一个视图获取信息

我知道动态SQL不是一个好主意,我正在使用的存储过程已经相当复杂了。将其重新创建为动态不是一个选项

我也读到过这样做是不可能的:

select * from @table
因为表名应该是静态的,而不是通过代码传递给存储过程

我试图实现的是这样的目标:

SELECT TOP(@top) subtaskid,activityid FROM 
(CASE WHEN @allProjects=1 THEN view_project_all ELSE view_project_mine) v
然而,我收到的错误消息是“关键字'CASE'附近的语法不正确”。我意识到这个问题与动态sql密切相关,而变量视图\表的问题遍布stackoverflow,但是我认为,由于我的两个表实际上都在存储过程中,这比hack更具功能性

问题是:是否有一种方法可以设置静态变量,以便此选项可以根据给定的参数询问不同的视图?

简单的方法:

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;
你可以使用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)

您可以放置一个简单的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

请参见编辑,使用两个视图的并集和disciminator(所有项目)创建新视图。这也行不通,这是因为两个独立视图中的值应该是独立的。如果不是,我将不需要两个视图:)您仍然可以创建第三个视图,但仅限于此SP。我不知道如何将这两个视图分开。然后需要更多的选择,以确定有多少记录在联合视图的每个部分中都有rds,因此我们只获取属于每个视图的行,并进行联合“排序”“这些行使得第一个视图中的行排在第一位,最后一个视图排在最后,或者它们是混合的?@BjørnØyvindHalvorsen。你会有三种观点:1<代码>查看项目和矿山,2<代码>查看所有项目,3<代码>查看项目联合(包含1和2的记录)_我的和你的都没变。继续在其他地方使用,不作任何更改_这一切就像将1和2粘在一起,并添加一个字段来确定源代码(
[allProjects]
)。您需要查询一个或另一个,但根据SP参数
@allProjects
,您只知道查询哪一个。在
[allProjects]=@allProjects
上查询新视图和过滤器。为什么不需要重复的代码?这有什么问题?动态sql是另一种方法。还有,为什么要在SP中使用视图为什么不直接使用底层表?通过管理这些视图,这些视图似乎正在访问相同的表,除了“筛选”和“全部”之外。您可以展开查询,然后将其放在单个语句中,并进行适当的筛选。你能发布视图定义吗?不想复制代码的明显原因是重构并使我们的代码库尽可能小。如果我们以后要改变这个过程中的某些事情,我们必须在多个地方进行,这是一件费时且昂贵的事情。:)使用不同视图的原因是,我们数据库中的表非常庞大,并且有很多不需要的信息,直接转到表意味着我必须编写大量的逻辑来以正确的顺序获取这些信息。视图定义无法发布,因为我在一家公司工作。抱歉:)在小型解决方案中,总是直接转到表,并将所有逻辑放在sp中可能会起作用,但这些视图在代码中使用,而不仅仅是在sp中。在调整程序行为时,直接使用到表也是一个弱点。顾问可以改变观点,使项目以不同于通常的方式运作,这是值得的。直接编程到表通常不是一个好主意,只需在两个地方更改代码,就可以快速增加到两个以上,这样就可以了。。。总的来说,我完全不同意你的逻辑:)