我的 SSIS 包中有一个 ADO.NET 源,我尝试进行以下查询:
“SELECT * FROM Table WHERE DateAdded > '@[User::InputDateV]'”
另一方面,我有一个名为 InputDateV 的 DateTime 变量。
我的问题是在变量值中我可以使用以下日期:24/10/2012 但我的 Sql 服务器这个日期无效,应该是 2012 年 10 月 24 日。
我如何将变量的日期时间格式更改为 (mm/dd/yyyy)?
谢谢。
问候。
何塞。
我的 SSIS 包中有一个 ADO.NET 源,我尝试进行以下查询:
“SELECT * FROM Table WHERE DateAdded > '@[User::InputDateV]'”
另一方面,我有一个名为 InputDateV 的 DateTime 变量。
我的问题是在变量值中我可以使用以下日期:24/10/2012 但我的 Sql 服务器这个日期无效,应该是 2012 年 10 月 24 日。
我如何将变量的日期时间格式更改为 (mm/dd/yyyy)?
谢谢。
问候。
何塞。
最安全的选择是将 DateTime 变量转换为 ISO 日期格式:
"'" + (DT_WSTR,4)YEAR(@[User::InputDateV])
+ RIGHT("0" + (DT_WSTR,2)MONTH(@[User::InputDateV]),2)
+ RIGHT("0" + (DT_WSTR,2)DAY(@[User::InputDateV]),2)
+ "'"
这将计算为“20121024”,因此是 SQL Server 的完美、明确的日期字符串。
日期时间数据类型没有格式。当您将其转换为字符串类型时,是的,您可以应用区域设置感知格式,但在内部,日期时间与区域设置无关。
我将以 ADO.NET 源代码作为我的回应的序言,它比 OLE 源代码要痛苦得多。
在我的复制中,我有一个执行 SQL 任务,它创建一个表并在其中粘贴一些数据。然后它路由到数据流任务。

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

要对其进行参数化,您需要返回到控制流级别。选择数据流任务并在属性下,您需要为 ADO NET 源的 SqlCommand 属性添加一个表达式。
根据我的经验,最好在变量上构建表达式并将变量分配到任务的属性中,而不是在任务本身中创建它。如果没有其他原因,这种方法允许您设置断点并查看本地变量并直观地检查值。这不能在对象的表达式上完成 - 特别是如果所述表达式导致包失败。
为此,您将看到我在我的 SSIS 包中定义了两个变量。
10/24/2012 12:01 AM我添加了一个时间组件只是为了显示它,但您可以根据需要将其删除。"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 是你的叔叔,包中的绿色框。
您可以使用 SSIS 字符串变量并将值保存为“mm/dd/yyyy”格式。传递给准备查询的值有单引号('),这样就可以了。如果要保持 SSIS 日期时间,请使用 System.DateTime 使用脚本组件准备查询,如下所示。那么您的查询将被准备好。希望这可以帮助。
public void Main()
{
// Map your variable using Dts.Variables["NameOfDateTimeVariable"].Value
DateTime dt= DateTime.Now;
var dateTime = string.Format("{0:mm/dd/yyyy}",dt);
var query = string.Format("SELECT * FROM Table WHERE DateAdded > '{0}'",dateTime);
//Map the query to your variable if you want
Dts.TaskResult = (int)ScriptResults.Success;
}
谢谢, 戈达曼