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密切相关,并且stackoverflow中的变量views\tables问题,但是我认为因为我的两个表实际上是在存储的程序这比黑客更具功能性......

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

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

你可以放一个简单的 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
于 2012-07-24T09:05:47.773 回答