如何捕获传递给ssis包运行时内部存储过程的参数

时间:2017-12-07 04:03:06

标签: sql-server-2008

我有一个场景,我的客户告诉我他们的sql server代理作业有时会失败。经过调查,我们发现sql代理程序作业调用了一个ssis包,它在内部调用带参数(?,?,?)的SP,并且根据错误消息在SP内部的TSQL中生成错误。

我想手动捕获参数以在新的查询窗口中测试SP执行。我们在客户端环境中没有用于调试SSIS包以识别参数的SSDT工具,但是我们已经在SSMS中导入了ssis包。

有没有办法可以通过SSMS中的ssis包捕获在运行时传递给SP的参数?

3 个答案:

答案 0 :(得分:1)

您可以打开sql server profiler并在执行SSIS包时捕获正在数据库中运行的查询,在那里您可以看到传入的参数。

答案 1 :(得分:1)

修改sp以捕获参数,然后再进行进一步处理。像这样:

    CREATE TABLE dbo.ProcParameters
    (
     SeqNo int identity(1,1),
    ProcNm VARCHAR(255),
    Param1 nvarchar(255),
    Param2 nvarchar(255),
ExecResult NVARCHAR(MAX),
    ExecTime DATETIME DEFAULT(GETDATE())
    )

    create procedure MyProc
    (
     @Param1 nvarchar(255),
    @Param2 nvarchar(255)
    )
    as
    begin
declare @Id int,@ExecResult NVARCHAR(MAX)

     insert into ProcParameters
    (
     ProcNm ,Param1 ,Param2
    )
    VALUES('MyProc',@Param1 ,@Param2)

select @id = @@identity
begin try
    /*

    Your Code goes here

    */
SET @ExecResult ='Success'

   end try
 BEGIN CATCH
select @ExecResult = ERROR_MESSAGE()
END CATCH

UPDATE ProcParameters
SET ExecResult = @ExecResult WHERE SeqNo = @id

    end

现在,每次执行proc时,这些值都将存储在ProcParameters表中,您可以从那里获取它。此外,每次执行的结果都可以在ExecResult列中找到。

答案 2 :(得分:1)

这个很简单,因为您可以在SP中编写要调试的代码:

  1- Create a table for variable capture 
  2- in procedure just give insert statement like 

 Insert into dbo.VariableLog values (@param1 , @param2 )