在视图中将列定义为可以为空(但不在引用的表中)

Neg*_*sro 8 sql-server t-sql sql-server-2012

我的公司正在努力实施一个新的 HR 应用程序,以统一我们现有的 HR 流程。不过,我们遇到了一些症结;根据业务规则,Employee表的EmployeeID和SupervisorID列不能为空。但是,应用程序要求这些列可以为空,并且不会在将列设置为不允许为空时同步这些列。

建议的解决方案是创建一个视图,其中架构似乎允许列中存在空值,同时保留表以防止它们被输入到数据中。我并不完全相信这是可能的,而且我一直无法找到一种方法来做到这一点。这可能吗?如果没有,处理这种情况的最佳方法是什么?

小智 10

是的,这是可能的:

select Id, -- Remains as in table
  cast(MandatoryIntCol as int) as [MandatoryIntCol], -- Makes nullable
  isnull(OptionalIntCol, 0) as [OptionalIntCol] -- Makes mandatory
from dbo.MyTable;
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这种方法有一些限制:

  1. 更改的列在视图中不可写,因此如果 OP 的应用程序尝试写入它们,它将失败。

  2. 应用程序不得试图区分表和视图。大多数应用程序没有,但令人讨厌的是,一些产品应用程序有。