2

我正在学习 MCTS 70-433 “数据库设计” 证书,在我正在学习的文本中,其中一个自测有这个问题。

您有一个名为 Get_NewProducts 的存储过程。您希望将此存储过程的结果插入到 Production.Product 表中,并使用 OUTPUT 子句输出 INSERTED.* 值。做这个的最好方式是什么?

有四种可能的答案。前三个选项都是“ INSERT...OUTPUT...EXECUTE Get_NewProducts ”语句的变体。第四个选项 D 简单地说“将存储过程重写为表值函数。”。

D 是正确答案。我不太明白为什么,文本中没有任何解释。有人有任何见解吗?

4

4 回答 4

5

好吧,来自msdn

“引用本地分区视图、分布式分区视图或远程表的 DML 语句或包含 execute_statement 的 INSERT 语句不支持 OUTPUT 子句。”

于 2009-09-29T23:31:16.490 回答
1

我对此的下意识反应(几天前我再次击中)是:

  • 存储过程可以并且经常是嵌套的。过程 A 调用 B,B 调用 C,以此类推。
  • 由 INSERT...EXECUTE... 语句调用的代码本身不能包含或引用 INSERT...EXECUTE... 语句。如果你把一个,你就不能在以后的 INSERT...EXECUTE... 中“嵌入”这个过程。

这可能看起来微不足道,而且通常是这样,至少在您在重构项目中遇到它之前是这样。一朝被蛇咬十年怕井绳。(它咬了我好几次。)

还有许多风格和外观原因,但它们有点肤浅。可能有一个严重的技术原因,可能与重新编译或查询执行计划有关;如果是这样,希望其他人会发布它们。

于 2009-09-29T21:54:17.020 回答
0

他们的“正确答案”不正确的原因之一是:TVF 在错误检查和报告方面存在问题。

这是一个非常奇怪的问题/答案,因为考虑到这个问题,D 甚至似乎都不可能。

于 2009-09-29T22:16:53.630 回答
0

我不知道“正确”的答案,但我猜作者的想法是 70-433Database Development是面向开发和设计的考试,而不是像 70-442 这样的“数据访问”考试之一。在设计阶段,您应该能够发现现有系统中的故障并提出更好的解决方案。作者认为需要将其输出插入表中的存储过程最好重写为 TVF。您会发现 TVF 是否比 proc 更好(插入 exec 嵌套 pro,错误处理错误只是开始)的缺点和优点。

我自己参加了一些考试,我发现考试准备材料和考试本身并不总是他们主题的绝​​对终极参考。总的来说,它们是正确且物有所值的,但它们时不时会出现问题,我至少发现了一些有问题的建议,甚至是明显错误的建议。在我发现错误的主题上,我实际上该主题的最终参考,它们涵盖了我在我设计的功能上编写的代码......

我的建议是了解什么是“预期”答案,并在实际考试中做好准备。鉴于你的天赋点和我所看到的答案,你已经超过了考试水平,所以只要通过铁环,获得你的考试徽章并继续前进。

于 2009-09-29T23:05:22.267 回答