SSIS数据流源中的存储过程与直接SQL命令
我正在为一些SSIS包提供维护支持。这些包有一些数据流源,其中包含复杂的嵌入式SQL脚本,需要不时修改。我正在考虑将这些SQL脚本移动到存储过程中,并从SSI调用它们,以便更易于修改、测试和部署。我只是想知道新方法是否有负面影响。有人能给我一个提示吗?老实说,我只看到了改进。正如您所指出的,存储过程将提供更好的安全性、由于缓存的执行计划而获得更好性能的可能性以及更容易的维护SSIS数据流源中的存储过程与直接SQL命令,sql,stored-procedures,ssis,Sql,Stored Procedures,Ssis,我正在为一些SSIS包提供维护支持。这些包有一些数据流源,其中包含复杂的嵌入式SQL脚本,需要不时修改。我正在考虑将这些SQL脚本移动到存储过程中,并从SSI调用它们,以便更易于修改、测试和部署。我只是想知道新方法是否有负面影响。有人能给我一个提示吗?老实说,我只看到了改进。正如您所指出的,存储过程将提供更好的安全性、由于缓存的执行计划而获得更好性能的可能性以及更容易的维护 重构 是的,将存储的过程用作数据源存在问题(尽管在控制流中,但在执行SQL任务时不使用存储的过程) 您可能需要阅读以下内容
重构 是的,将存储的过程用作数据源存在问题(尽管在控制流中,但在执行SQL任务时不使用存储的过程) 您可能需要阅读以下内容: 基本上,问题在于SSI不能总是从存储的进程中找出结果集和列。如果您编写使用临时表的存储过程,我个人会遇到这种情况
我不知道我会走到文章作者的地步,根本不使用proc,但要小心,不要尝试过多地使用它们,如果必须做一些复杂的事情,请在数据流之前在执行sql任务中执行 仅使用简单的存储过程作为数据源不会遇到问题。若程序使用临时表和CTE,则不能保证您不会遇到问题。即使您可以在设计时预览结果,也可能在运行时出错。我的经验是,尝试让存储过程作为数据源运行是不值得的。也许一些简单的存储过程就可以了,在某些情况下TVF可以很好地工作,但是如果您需要执行一些复杂的操作,除了存储过程之外别无选择 我发现的最佳解决方法是为需要在SSI中使用的每个存储过程创建一个输出表
SELECT
语句结束Exec SQL
任务调用存储过程Exec SQL
再次截断输出表。我更愿意保留它,因为它允许我稍后检查数据,如果输出数据流失败,则允许我重新运行输出数据流,而无需再次调用存储过程当然,所有这些都假设您有权调整所讨论的存储过程。如果需要,您可以编写一个新的包装存储过程来截断输出表,然后调用旧的存储过程并将其输出重定向到新表。谢谢!我要这么做!正确参数化的查询对性能的影响与存储过程一样好——它也会被缓存,它的执行计划也会被重用——在这方面对存储过程没有好处,恐怕……@marc_这是正确的——问题中有太多的模糊性,无法确定是否是这样。因此,我将更正我的答案,阅读可能的性能优势。感谢回复。我读了HLGEM指出的帖子和相关帖子。大多数嵌入式脚本都是通过多个连接(有时跨不同的数据库)和联合选择的。没有涉及任何参数或临时表。当我在源代码编辑器中单击“Columns”时,我可以看到这些列。从我在文章中读到的内容来看,我想我可以安全地使用存储过程。还有什么问题吗?我只是想在迈出这一步之前小心点。哇哦!我建议你阅读他作为消息来源发布的链接。如果您的存储过程编写得很好,就不会出现这些问题。在OLEDB源中使用存储过程肯定有可能带来好处。它就像SQL中的其他任何东西一样,所有东西都有它的用途,必须正确使用。我同意您可以通过更好的存储过程来避免大多数问题,但OP确实询问了使用过程是否存在问题,是否存在问题。如果你不知道你必须小心,那么你可能不小心。这就是为什么我说我不会像作者那样说永远不要使用它们。是的,我只是指出,使用存储过程没有那么危言耸听,而且信息更丰富。谢谢你提供的信息。我阅读了HLGEM帖子中的链接文章以及该链接中的链接文章。我以前不知道这些问题。现在,我将非常小心地在OLEDB源中使用SPs。再次感谢您的回复!查看“使用结果集”调用。它允许您在声明预期结果的元数据时执行存储过程,并允许SSIS运行。@BilliD:非常好!那应该容易多了,谢谢你的提示!