我按照http://msdn.microsoft.com/en-us/library/bb895315.aspx的步骤实施增量加载。根据step1的最后一步,我在SSDT中声明了一个字符串变量,并为其分配一个字符串 SqlString ='select * from CustomizedFunction(Argument1,Argument2,Argument3)' SqlString很好,因为我已经在SSMS中打印出来了。
但是,在数据流的OLEDB数据源中访问SqlString时。发生错误
HRESULT:为0xC0202009 数据流任务 - 负载数据的错误[OLEDB源[1]]:SSIS错误代码DTS_E_OLEEBERROR。发生OLEDB错误。错误代码:0x80040E0C。 OLEDB记录可用。来源:“Microsoft SQL Server Native Client11.0”HResult:0x80040E0C描述:“没有为命令对象设置命令文本。”
答案 0 :(得分:0)
我不明白你是如何在SSMS中声明的SSMS中打印变量的。
如果表值函数的参数是动态的,则必须在SSIS中将变量声明为字符串并使用* Exression * s构建SQL命令。
在配置 OLEDB源时,您已在数据访问模式中选择选项“来自变量的SQL命令”并选择变量“SqlString”
答案 1 :(得分:0)
SSIS OLE DB Source必须具有初始列定义才能工作。当您使用来自变量'的SQL命令时,您需要提供此列定义。
让我先从概念的一般应用开始。然后我将解决您的特定情况。
一般情况
在某些情况下,您可能有一个没有初始值的字符串变量,并且在该过程中的某个时刻,该值已分配。在这种情况下,必须提供初始值。一种方法是使用提供列和数据类型的虚拟查询。
例如,将变量的初始值设置为:
SELECT CAST('' AS VARCHAR(10) AS MyColumn1, 0 AS MyInteger FROM MyTable WHERE 1= 2
此查询永远不会返回结果,但它提供了OLE DB源所需的列定义。 在OLE DB源执行之前的某个时刻,您需要将实际查询分配给变量。
具体案例
您的情况类似,但略有不同。 在您的特定情况下,您有此查询:
SqlString='select * from CustomizedFunction(Argument1,Argument2,Argument3)'
OLE DB Source不知道SELECT *
列的定义是什么。您需要将SELECT *
替换为实际的列名及其数据类型。
SqlString='SELECT CAST(MyColumn1 AS VARCHAR(10)) AS MyColumn1, CAST(MyColumn2 AS INT) AS MyColumn2 FROM CustomizedFunction(Argument1,Argument2,Argument3)'
答案 2 :(得分:0)
根据最近对此问题的经验,我添加了一个更新答案。
在为所有列设置别名的步骤之后(给每列一个列标题) 我们必须在 SSIS 任务的高级编辑器中完成将“验证外部元数据”设置为 false 的附加步骤。一旦完成,错误就为我们消除了。
我将其留在这里作为对未来遇到此问题的用户的额外帮助。