存储过程与表值函数的OUTPUT子句

时间:2009-09-29 21:44:38

标签: sql-server tsql sql-server-2008 stored-procedures output-clause

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

  

您有一个名为的存储过程   Get_NewProducts。你想插入   此存储过程的结果   进入Production.Product表和   使用输出INSERTED。*值   OUTPUT子句。什么是最好的方法   这样做?

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

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

4 个答案:

答案 0 :(得分:5)

好吧,来自msdn

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

答案 1 :(得分:1)

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

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

这看似微不足道,而且通常情况下,至少在重构项目中遇到它之前。一朝被蛇咬十年怕井绳。 (它有点像我一样。)

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

答案 2 :(得分:0)

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

这是一个非常奇怪的问题/答案,因为在这个问题上D似乎不太可能。

答案 3 :(得分:0)

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

我自己参加了一些考试,我发现考试准备材料和考试本身并不总是对他们学科的绝对最终参考。在大的,他们是正确和良好的价值,但他们在这里有问题,我发现至少一些有问题的建议甚至是错误的建议。关于我发现错误的主题,我实际上关于这个主题的最终参考,它们涵盖了我在我设计的功能上写的代码......

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