我有两个视图返回相同的列,但返回不同的行。
我正在创建一个使用这些视图的存储过程。存储过程很大,并在列中搜索匹配的行。
现在,我的愿望是:如果我收到一个值为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更多功能...
问题是:有没有办法设置静态变量,所以这个选择可以根据给定的参数询问不同的视图?
答案 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