小编Bri*_*ian的帖子

为什么向视图添加列会损坏表值函数?

我有一个 TVPmyTVP实现为select val.* from vw_MyView val. 前几天,我修改了vw_MyView,将: 替换
select Foo,Bar from DB
select Foo, Bash, Bar from DB

这有一个奇怪的副作用:调用select Bar from myTVP()返回一个名为Bar填充了内容的列Bash(尽管事实上BarBash甚至没有相同的类型)。

展示问题的匿名计划:https://www.brentozar.com/pastetheplan/?id=ryJLJmqdl

请注意,Object2Object1是相同的,但两个计划之间最左侧嵌套循环的输出列表完全不同。

笔记:

  • 使用中没有计划提示。未设置跟踪标志。
  • CheckDB 没有发现错误。
  • 使用选项(重新编译)并没有解决问题。
  • 在 TVP 上运行右键单击 alter 且不进行任何更改修复了该问题。
  • 在名称更改的 TVP 上运行右键单击 alter 修复了该问题,但新的 TVP 除名称外与之前的相同。
  • 使用SQL 2014标准版。

问题:

  1. 向视图添加新列以更改对该视图的其他引用所使用的视图列是否正常?
  2. 在什么情况下向视图添加列会导致这种行为?

sql-server view sql-server-2014 set-returning-functions

1
推荐指数
1
解决办法
387
查看次数