我的SSIS包中有一个ADO.NET Source,我试图进行以下查询:
“SELECT * FROM Table WHERE DateAdded>'@ [User :: InputDateV]'”
另一方面,我有一个名为InputDateV的DateTime变量 .
我的问题是,在变量值我可以使用以下日期:24/10/2012但我的Sql服务器此日期无效,应该是10/24/2012 .
我如何才能将变量的日期时间格式更改为(mm / dd / yyyy)?
谢谢 .
问候 .
何塞 .
3 回答
最安全的做法是将DateTime变量转换为ISO日期格式:
这将评估为“20121024”,因此是SQL Server的完美,明确的日期字符串 .
datetime数据类型没有格式 . 当您将其转换为字符串类型,然后是,您可以应用区域设置感知格式,但在内部日期时间与区域设置无关 .
我将使用ADO.NET源代码的前言比OLE对应程序更令人痛苦 .
在我的复制中,我有一个执行SQL任务,它创建一个表并在其中粘贴一些数据 . 然后它路由到数据流任务 .
在我的数据流中,我从
SELECT T.* FROM dbo.[Table] AS T
的查询开始 . 目前没有WHERE子句 . 这是为了允许数据流组件注册源查询的元数据 .要对其进行参数化,您需要返回到控制流级别 . 选择“数据流任务”,在“属性”下,需要为ADO NET源的SqlCommand属性添加表达式 .
根据我的经验,可以更好地为变量构建表达式并将变量分配给Task的属性而不是在Task本身中创建它 . 如果没有其他原因,这种方法允许您设置断点并查看您的本地人并直观地检查该值 . 这不能在对象的表达式上完成 - 特别是如果所述表达式导致包失败 .
为此,您将看到我在SSIS包中定义了两个变量 .
InputDateV - 数据类型是DateTime,它的值为
10/24/2012 12:01 AM
我添加了一个时间组件,只是为了显示它,但你可以根据需要去除它 .查询 - 数据类型为String . 这个变量的属性是EvaluateAsExpression = True而Expression是
"SELECT T.* FROM dbo.[Table] T WHERE T.DateAdded > '" + (DT_WSTR, 24)@[User::InputDateV] + "'"
这里我强制将语言环境不可知的datetime值转换为语言环境感知类型,但因为它's through the magic of .NET code, it'll工作 .然后我使用@ [User :: Query]配置[ADO NET Source] . [SqlCommand]并且神奇地说,一切正常 .
在关闭机会时,我误解了你上面关于你的变量名的定义 . 如果@ [User :: InputDateV]实际上是一种String类型,那么以上内容对你不起作用 . 我创建了一个变量@ [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使用脚本组件准备查询,如下所示 . 那么你的查询将准备好 . 希望这可以帮助 .
谢谢,Gowdhaman