6

我在 SQL Server 商业智能开发工作室中创建了 SSIS 包。如果我在那里运行该包可以正常工作,因此我部署了该包。

然后我使用包安装向导,将其安装在本地 SQL Server 2005 上。

现在我想在我的触发器中使用它。

我知道如何从文件中执行一个包,但是当它安装在 SQL Server 中时如何执行它?

谢谢你。

4

4 回答 4

8

正如我之前提到的:我不会将这样的任务放入触发器中。由于您无法控制触发触发器的时间和次数,因此触发器中的任何内容在执行时间方面都应该非常短。不要长时间运行的处理放入触发器中!

我的方法是:

  1. 触发器将一个条目写入表(“作业”表或任何您想调用的表)

  2. 例如每 5 分钟运行一次的任务(例如 SQL 代理作业)。或读取该表的任何内容,并在必要时写入文件。

这将触发代码与实际写入文件的较长过程分离。

否则,您的系统性能将受到这个潜在的非常长时间运行的触发器的严重影响......

于 2012-05-31T06:54:39.427 回答
1

有一种方法可以从 T-SQL 执行 SSIS 包,但我认为这是一种非常不可靠的方法。它涉及启用“xp_cmdshell”选项和使用 dtexec。但这绝对不能用于触发器!无论如何,正如 marc_s 在他的评论中指出的那样,触发器应该非常精简。由于它是触发命令事务的一部分,因此任何长时间运行的操作,尤其是 SSIS 包,都会大大降低您的数据库速度。

于 2012-05-31T06:34:40.203 回答
1

我会将其分解为单独的步骤。文件要求可能在那里,但请考虑一下:只要每一行都生成一个文件,如果创建文件可能需要五到十分钟,这真的会破坏交易吗?这是否比您从触发器中运行 SSIS 包所看到的连锁效应更糟糕?

所以:

第 1 步:触发器只需将一行插入到另一个表中,其中包含要创建的文件所需的信息。
第 2 步:修改您的 SSIS 包,使其有一个额外的早期步骤,即轮询该表以查找任何新条目,根据需要创建文件,然后将条目标记为已完成(或完全删除它们,但我个人喜欢审计跟踪)。
第 3 步:将计划作业添加到每 5 分钟运行该 SSIS 包的服务器。

如果您不想修改 SSIS 包,则可以改为创建一个存储过程来轮询表并执行包,并将其安排在作业中。最主要的是摆脱直接从触发器触发包裹的想法。

上述方法还将最大限度地减少潜在问题的影响,例如文件目的地由于某种原因不可用。

于 2012-05-31T06:51:36.643 回答
1

只是补充所有其他答案,你绝对不应该这样做。在我看来,marc_s 将数据插入表并每 X 分钟有一份工作的想法是最好的方法。

PS1:是关于如何从 SP 调用包的链接

PS2:回答您的其他问题,使用 DTEXEC 调用存储在 SQl 上的包,只需替换 /FILE/SQL

dtexec /sql "\YourPackage"
于 2012-05-31T08:55:04.983 回答