Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS数据流源中的存储过程与直接SQL命令_Sql_Stored Procedures_Ssis - Fatal编程技术网

SSIS数据流源中的存储过程与直接SQL命令

SSIS数据流源中的存储过程与直接SQL命令,sql,stored-procedures,ssis,Sql,Stored Procedures,Ssis,我正在为一些SSIS包提供维护支持。这些包有一些数据流源,其中包含复杂的嵌入式SQL脚本,需要不时修改。我正在考虑将这些SQL脚本移动到存储过程中,并从SSI调用它们,以便更易于修改、测试和部署。我只是想知道新方法是否有负面影响。有人能给我一个提示吗?老实说,我只看到了改进。正如您所指出的,存储过程将提供更好的安全性、由于缓存的执行计划而获得更好性能的可能性以及更容易的维护 重构 是的,将存储的过程用作数据源存在问题(尽管在控制流中,但在执行SQL任务时不使用存储的过程) 您可能需要阅读以下内容

我正在为一些SSIS包提供维护支持。这些包有一些数据流源,其中包含复杂的嵌入式SQL脚本,需要不时修改。我正在考虑将这些SQL脚本移动到存储过程中,并从SSI调用它们,以便更易于修改、测试和部署。我只是想知道新方法是否有负面影响。有人能给我一个提示吗?

老实说,我只看到了改进。正如您所指出的,存储过程将提供更好的安全性、由于缓存的执行计划而获得更好性能的可能性以及更容易的维护


重构

是的,将存储的过程用作数据源存在问题(尽管在控制流中,但在执行SQL任务时不使用存储的过程)

您可能需要阅读以下内容:

基本上,问题在于SSI不能总是从存储的进程中找出结果集和列。如果您编写使用临时表的存储过程,我个人会遇到这种情况


我不知道我会走到文章作者的地步,根本不使用proc,但要小心,不要尝试过多地使用它们,如果必须做一些复杂的事情,请在数据流之前在执行sql任务中执行

仅使用简单的存储过程作为数据源不会遇到问题。若程序使用临时表和CTE,则不能保证您不会遇到问题。即使您可以在设计时预览结果,也可能在运行时出错。

我的经验是,尝试让存储过程作为数据源运行是不值得的。也许一些简单的存储过程就可以了,在某些情况下TVF可以很好地工作,但是如果您需要执行一些复杂的操作,除了存储过程之外别无选择

我发现的最佳解决方法是为需要在SSI中使用的每个存储过程创建一个输出表

  • 修改存储过程以在开始时截断新的输出表,并将其输出写入该表,而不是(或另外)以
    SELECT
    语句结束
  • 在数据流之前,使用
    Exec SQL
    任务调用存储过程
  • 让您的数据流从输出表中读取—这是一项简单得多的任务
  • 如果要节省空间,请使用另一个
    Exec SQL
    再次截断输出表。我更愿意保留它,因为它允许我稍后检查数据,如果输出数据流失败,则允许我重新运行输出数据流,而无需再次调用存储过程
  • 这当然不如直接从存储过程的输出中读取优雅,但它是有效的。FWIW,这种模式遵循了存储过程不应试图成为参数化视图的理念(在Oracle中是有义务的)


    当然,所有这些都假设您有权调整所讨论的存储过程。如果需要,您可以编写一个新的包装存储过程来截断输出表,然后调用旧的存储过程并将其输出重定向到新表。

    谢谢!我要这么做!正确参数化的查询对性能的影响与存储过程一样好——它也会被缓存,它的执行计划也会被重用——在这方面对存储过程没有好处,恐怕……@marc_这是正确的——问题中有太多的模糊性,无法确定是否是这样。因此,我将更正我的答案,阅读可能的性能优势。感谢回复。我读了HLGEM指出的帖子和相关帖子。大多数嵌入式脚本都是通过多个连接(有时跨不同的数据库)和联合选择的。没有涉及任何参数或临时表。当我在源代码编辑器中单击“Columns”时,我可以看到这些列。从我在文章中读到的内容来看,我想我可以安全地使用存储过程。还有什么问题吗?我只是想在迈出这一步之前小心点。哇哦!我建议你阅读他作为消息来源发布的链接。如果您的存储过程编写得很好,就不会出现这些问题。在OLEDB源中使用存储过程肯定有可能带来好处。它就像SQL中的其他任何东西一样,所有东西都有它的用途,必须正确使用。我同意您可以通过更好的存储过程来避免大多数问题,但OP确实询问了使用过程是否存在问题,是否存在问题。如果你不知道你必须小心,那么你可能不小心。这就是为什么我说我不会像作者那样说永远不要使用它们。是的,我只是指出,使用存储过程没有那么危言耸听,而且信息更丰富。谢谢你提供的信息。我阅读了HLGEM帖子中的链接文章以及该链接中的链接文章。我以前不知道这些问题。现在,我将非常小心地在OLEDB源中使用SPs。再次感谢您的回复!查看“使用结果集”调用。它允许您在声明预期结果的元数据时执行存储过程,并允许SSIS运行。@BilliD:非常好!那应该容易多了,谢谢你的提示!