【发布时间】:2023-02-23 03:40:51
【问题描述】:
我有一个奇怪的问题,我有这样的控制流程:
最后是这样的数据流:
我正在尝试从 QuickBooks 桌面文件读取数据,但为了确保我不会不必要地运行数据流任务,我首先比较了 SQL Server 和 Quickbooks 的修改时间。然后,如果返回的记录计数大于零,则执行数据流任务。 数据流任务中的表达式如下:
"SELECT ListID, [Name], CompanyName, TermsRefFullName, IsActive, Notes, TimeModified, TimeCreated FROM Customer WHERE TimeModified > {ts '" + @[User::CustomerMaxTimeMod] + "'} ORDER BY TimeModified DESC"
CustomerMaxTimeMod 是一个字符串变量,它存储我在控制流的第 1 步中获得的最大修改时间。
我知道此表达式有效,因为当数据流首先进入控制流或单独进入时,数据流执行得很好。然而,问题是当这个数据流是一个更大的控制流的一部分并且不是首先执行时,它就会中断说:
[ADO NET Source [2]] Error: An error occurred executing the provided SQL command: <my expression here> ERROR [42000] [QODBC] [sql syntax error] Expected lexical element not found: = <identifier>
[SSIS.Pipeline] Error: "ADO NET Source" failed validation and returned validation status "VS_ISBROKEN".
我对此进行了研究,并且看到有人建议在数据流上将 delay validation 属性设置为 true。我试过了,同时尝试将 validate external metadata 设置为 false。它无论如何都会中断,但会显示一条错误消息:
[ADO NET Source [2]] Error: System.Data.Odbc.OdbcException (0x80131937): ERROR [42000] [QODBC] [sql syntax error] Expected lexical element not found: = <identifier> at System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode) at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod) at System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader) at System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior) at Microsoft.SqlServer.Dts.Pipeline.DataReaderSourceAdapter.PreExecute() at Microsoft.SqlServer.Dts.Pipeline.ManagedComponentHost.HostPreExecute(IDTSManagedComponentWrapper100 wrapper)
此时我几乎只是在将不同的属性设置为 true 或 false 之间徘徊,不知道该怎么做。任何帮助表示赞赏!
【问题讨论】:
-
@[User::CustomerMaxTimeMod]的默认/设计时间值是多少 -
@billinkc 字符串的默认值只是我选择并放入值字段中的一些随机日期时间值,这样 ADO 源就不会在设计时抱怨与空字符串进行比较。因为无论如何我都在控制流的第 1 步中获得了该值并替换了它,所以它是什么重要吗?
标签: ssis ado.net visual-studio-2022 dataflowtask qodbc