4

我的 SSIS 包中有一个 ADO.NET 源,我尝试进行以下查询:

“SELECT * FROM Table WHERE DateAdded > '@[User::InputDateV]'”

另一方面,我有一个名为 InputDateV 的 DateTime 变量。

我的问题是在变量值中我可以使用以下日期:24/10/2012 但我的 Sql 服务器这个日期无效,应该是 2012 年 10 月 24 日。

我如何将变量的日期时间格式更改为 (mm/dd/yyyy)?

谢谢。

问候。

何塞。

4

3 回答 3

4

最安全的选择是将 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 的完美、明确的日期字符串。

于 2012-10-24T17:09:56.647 回答
1

日期时间数据类型没有格式。当您将其转换为字符串类型时,是的,您可以应用区域设置感知格式,但在内部,日期时间与区域设置无关。

我将以 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 是你的叔叔,包中的绿色框。

参考

于 2012-10-24T23:57:17.063 回答
0

您可以使用 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;
}

谢谢, 戈达曼

于 2012-10-24T11:32:00.783 回答