日期时间数据类型没有格式。当您将其转换为字符串类型时,是的,您可以应用区域设置感知格式,但在内部,日期时间与区域设置无关。
我将以 ADO.NET 源代码作为我的回应的序言,它比 OLE 源代码要痛苦得多。
在我的复制中,我有一个执行 SQL 任务,它创建一个表并在其中粘贴一些数据。然后它路由到数据流任务。

在我的数据流中,我从查询SELECT T.* FROM dbo.[Table] AS T
. 目前没有 WHERE 子句。这是为了允许数据流组件注册源查询的元数据。

要对其进行参数化,您需要返回到控制流级别。选择数据流任务并在属性下,您需要为 ADO NET 源的 SqlCommand 属性添加一个表达式。
根据我的经验,最好在变量上构建表达式并将变量分配到任务的属性中,而不是在任务本身中创建它。如果没有其他原因,这种方法允许您设置断点并查看本地变量并直观地检查值。这不能在对象的表达式上完成 - 特别是如果所述表达式导致包失败。
为此,您将看到我在我的 SSIS 包中定义了两个变量。
- InputDateV - 数据类型是 DateTime,它的值是
10/24/2012 12:01 AM
我添加了一个时间组件只是为了显示它,但您可以根据需要将其删除。
- 查询 - 数据类型是字符串。这个变量的属性是 EvaluateAsExpression = True 并且表达式在
"SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)@[User::InputDateV] + "'"
这里 我将与语言环境无关的日期时间值强制为一种语言环境感知类型,但因为它是通过 .NET 代码的魔力,所以它会起作用。
然后我使用@[User::Query] 配置[ADO NET Source].[SqlCommand],神奇的是,一切正常。
万一我误解了你上面关于变量名的定义。如果@[User::InputDateV] 实际上是一种字符串,那么上面的方法对你不起作用。我创建了一个数据类型为字符串的变量@[User::InputDateS],并为其分配了一个值24/10/2012
。如果我修改 @[User::Query] 表达式以使用它,SQL Server 将拒绝它,因为它无法将该值转换为日期时间数据类型。所以让 SSIS 表达式执行翻译。将 @[User::Query] 上的表达式修改为
"SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)((DT_DATE) @[User::InputDateS]) + "'"
Bob 是你的叔叔,包中的绿色框。
参考