【发布时间】:2010-08-13 16:49:30
【问题描述】:
有没有办法停止当前正在运行的 SQL Server 2000 DTS(不是 SSIS)包,使用 C# 以编程方式?我认为可以使用 COM API 执行包,但我找不到停止正在运行的包的方法。提前致谢。
更新:SSIS 中有一种方法可以获取正在运行的包的列表以及一种停止它们的方法。但我在 COM 对象 API 中找不到与 DTS 包等效的包。
【问题讨论】:
有没有办法停止当前正在运行的 SQL Server 2000 DTS(不是 SSIS)包,使用 C# 以编程方式?我认为可以使用 COM API 执行包,但我找不到停止正在运行的包的方法。提前致谢。
更新:SSIS 中有一种方法可以获取正在运行的包的列表以及一种停止它们的方法。但我在 COM 对象 API 中找不到与 DTS 包等效的包。
【问题讨论】:
这里有几个选项:
如果您正在作业中运行 DTS 包,则可以使用 sp_stop_job 停止正在运行的作业。
如果您知道 DTS 包的进程的 SPID,则可以向 SPID 发出KILL command,这将停止 DTS 包的执行。识别 SPID 的一种可能方法是通过一些识别信息在 master.dbo.sysprocesses 表中找到 SPID,然后为 SPID 发出 KILL 命令。这是我通过将连接属性 -> 高级 -> 应用程序名称设置为 I Want To Kill This SPID 测试的一组代码。
声明@TEST INT;
SET @TEST =
(选择最大值(SPID)
来自 master.dbo.sysprocesses
WHERE program_name IN ('I Want To Kill This SPID'));
如果@TEST 不为空
开始
DECLARE @KILL_COMMAND NVARCHAR(100);
SET @KILL_COMMAND = 'KILL' + CONVERT(NVARCHAR(100), @TEST);
执行 sp_executeSQL @KILL_COMMAND;
结束
上述方法的缺点是它仅适用于杀死具有数据库连接的包。如果您使用的 DTS 包未连接到主机服务器,则不会有可终止的 SPID。如果有多个 SPID,这也不会全部杀死它们。您可能必须修改代码以构建要杀死的 SPID 列表。然后是您必须设置应用程序名称的事实。您可能希望为每个 DTS 包设置唯一值,以免意外杀死错误的包。默认值似乎设置为 DTS 设计器,如果服务器上正在运行多个包,这将很难杀死。
您可能能够启动并终止 DTS 2000 软件包 using extended stored procedures,但我不能 100% 确定这是可行的。
【讨论】: