sql-server - 存储过程,并从两个几乎相同的 View 中进行选择

标签 sql-server stored-procedures view

我有两个返回相同列但不同行的 View 。

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

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

我知道动态 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密切相关,并且变量 View \表问题遍布stackoverflow,但是我认为因为我的两个表实际上是在存储过程中,这比 hack 更多的功能......

问题是这样的:有没有一种方法可以设置静态变量,以便这个选择可以根据给定的参数询问不同的 View ?

最佳答案

简单的方法:

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

如果您愿意,您可以创建一个联合这些表的 View ,然后针对该 View 执行查询:

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;

关于sql-server - 存储过程,并从两个几乎相同的 View 中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11626419/

相关文章:

SQL DISTINCT 不会删除重复项

按唯一 IP 的 MySQL 页面 View

view - Aurelia - 直通路线

mysql - 使用 SQL 连接时如何合并/组合数据?

java - 在 Java 中使用 SQL Server 数据库

c# - sql server - 我如何在列中查找带有空格的行

mysql - mysql中的if..then语句

MySQL从动态数据库和表查询中选择

mysql - 处理 MySQL 事务中的延迟

android - 有没有办法以编程方式将 ScrollView 滚动到特定的编辑文本?