sql - 如何在视图中的 CASE 语句中运行存储过程或函数?
问题描述
我有一个基于一系列CASE
陈述的观点。我必须做的一项检查是给定列的值是否为 0 并且是否存在任何其他记录,其中某些列NOT NULL
返回一个字符串。
它看起来像这样:
SELECT
CASE WHEN (Column1 = 0 AND EXEC CheckExistsNonTypeIncreases = 1) THEN 'Missing or invalid data' ELSE '' END AS IncreaseCheck
FROM MyTable1
MyTable1
由可以为空的货币列组成。
CheckExistsNonTypeIncreases
看起来像这样:
DECLARE @Exists BIT
IF EXISTS(SELECT * FROM [dbo].MyTable1 WHERE (Column2 IS NOT NULL OR
Column3 IS NOT NULL OR
Column4 IS NOT NULL OR
Column5 IS NOT NULL OR
Column6 IS NOT NULL))
BEGIN
SET @Exists = 1
END
ELSE
BEGIN
SET @Exists = 0
END
RETURN @Exists
视图不能有变量,所以我不能运行预先进行检查的 SP。我也无法将EXEC
语句嵌入到CASE
. 有没有办法CheckExistsNonTypeIncreases
在CASE
语句中运行?如果可行,我不介意更改CheckExistsNonTypeIncreases
为一个函数,但除了这个之外我无法更改视图CASE
。我将其设为存储过程的唯一原因是函数需要一个参数,而这不需要。
编辑 -
想通了,当我把它变成一个函数时它不起作用,因为我没有使用 [dbo] 前缀。
解决方案
有没有办法在 CASE 语句中运行 CheckExistsNonTypeIncreases?
不。(实际上 CASE 是一个表达式,而不是 at 语句,这可以解释为什么不)。您可以做的是将 proc 重构为一个函数并使用它。
推荐阅读
- mysql - SQL 触发器:我想让 TRIGGER AFTER UPDATE 并更新它从不同的表中获取数据
- xamarin - 由于现有相机用户 [XAMARIN.FORM],相机“0”的手电筒不可用
- vb.net - 如何交换数据网格视图中的列
- angular - 如何从有角度的机会中导入机会?
- android - 由于进程无法加载 jdwp 代理,因此未启动调试器。反应原生
- python - 在下拉列表中显示 django 中的模型字段
- mysql - MYSQL 中的多个条目中选择一个单词
- javascript - 如何创建一个多重过滤功能来过滤掉多个属性?
- java - 为什么一些垃圾收集和 OOP 编程语言没有析构函数?
- reactjs - 允许任何 html 属性的打字稿类型