SQL服务器2016 SSIS得到从存储过程光标(SQL Server 2016 SSIS get

2019-11-04 07:03发布

我使用SQL Server 2016年

  1. 我有一个存储过程GET_RECORDS其取得输入参数,滤波器和输出CURSOR参数

  2. 我希望得到这个光标在我的SSIS包

  3. 我创造了数据流任务,OLEDB源和变量的参数值。 然后映射参数

PARAMS映射屏幕

但是当我想保存组件 - 我得到了一个错误

错误屏幕

我想补充条款WITH RESULT SETS有一些虚拟的列,但我的过程不返回任何结果集

我究竟做错了什么?

任何建议将是有益的。

谢谢。

与问候,尤里。

Answer 1:

源组件试图确定将返回哪些列和类型。 因为你使用动态SQL元数据可以在每次运行时间而改变。

使用结果集允许您定义返回的数据,但如果你保证你每次执行时的结果,才应使用。

编辑:我创建了一个连接,然后运行命令,以便它填充的数据表。 然后,我把列标题为一个字符串数组。 有很多的例子在那里。

然后,我用下面的函数来创建目标表。 最后我创造一个DataReader并传递到.NET SqlBulkCopy的。 希望这可以帮助。

private void CreateTable(string TableName, string[] Fields)
        {                

            if (TableExists(TableName) && Overwrite)
            {
                SqlCommand = new SqlCommand($"Drop Table [{TableName}]", SqlConnection);
                SqlCommand.ExecuteNonQuery();
            }

            string Sql = $"Create Table [{TableName}] (";

            int ColumnNumber = 1;
            foreach (string Field in Fields)
            {
                string FieldValue = Field;
                if (! HasHeaders)
                {
                    FieldValue = "Column" + ColumnNumber;
                    ColumnNumber++;
                }
                Sql += $"[{FieldValue}] Varchar(8000),";
            }
            Sql = Sql + "ImportFileID Int, ID Int Identity(1,1) Not Null, Constraint [PK_" + TableName + "] Primary Key Clustered ([ID] Asc))";

            SqlCommand = new SqlCommand(Sql, SqlConnection);
            SqlCommand.ExecuteNonQuery();
        }


Answer 2:

使用ado.net源,而不是OLEDB源,定义了一个简单的选择,让你想返回的列。 现在,您可以在数据流的属性定义expresión。

搜索ado.net源动态sql

:)



Answer 3:

尝试返回的记录,并在ETL使用的foreach代替光标

https://www.simple-talk.com/sql/ssis/implementing-foreach-looping-logic-in-ssis/

我想你可以从一个简单的方法做到这一点,但我不知道你在干什么,究竟是什么?



文章来源: SQL Server 2016 SSIS get cursor from stored procedure