如何在SSIS表达式生成器中使用日期时间值来制定SQL命令?

问题描述 投票:0回答:2

我正在尝试使用 Ado.Net Sql 命令从带有日期过滤器的表中选择数据。

SELECT  COLUMN1
    ,   COLUMN2 
FROM    TABLENAME 
WHERE   DATE_INSERTED > @[User::LastInsertDate]

Date_Inserted
@[User::LastInsertedDate]
都是
DateTime
类型。当我尝试在表达式生成器中计算表达式时,出现以下错误;

表达式可能包含无效标记、不完整标记或 无效元素,它可能格式不正确,或者可能丢失 必需元素的一部分,例如括号。

对已接受答案的原始修订进行的问题诊断:

这是我对你的问题的理解。我相信你创造了 包范围下的两个变量。名为

LastInsertDate
的变量 的 DateTime 数据类型和另一个名为
SqlQuery
的变量 String 数据类型,用于存储 SQL SELECT 命令。

Variables declaration

您将变量 SqlQuery

EvaluateAsExpression
属性设置为
True
。然后输入以下命令
SELECT COLUMN1, COLUMN2 FROM TABLENAME WHERE DATE_INSERTED > @[User::LastInsertDate]

Expression Builder

当您单击 EvaluateAsExpression 时,您收到以下错误 留言:

Expression cannot be evaluated. Additional information: Attempt to
parse the expression "SELECT COLUMN1, COLUMN2 FROM TABLENAME WHERE
DATE_INSERTED > @[User:LastInsertDate]" failed. The expression might
contain an invalid token, an incomplete token, or an invalid element.
It might not be well-formed, or might be missing part of a required
element such as a parenthesis. 

Error message

ado.net ssis sqlcommandbuilder
2个回答
11
投票

这里的问题是您尝试存储在变量 SqlQuery 中的值未用双引号括起来。 动态查询的字符串值需要用双引号括起来。

将文本用双引号引起来时,您不能按原样使用日期时间变量

LastInsertDate
。您需要将日期时间变量转换为字符串,但如果您只是将日期时间值转换为字符串,则可能会出现意外的格式。为了安全起见,我建议使用
DATEPART
函数将日期时间值转换为格式为
YYYY-MM-DD hh:mi:ss
的字符串。这是完成此操作的完整表达式。

"SELECT COLUMN1, COLUMN2 FROM TABLENAME WHERE DATE_INSERTED > '" +
(DT_STR, 4, 1252) DATEPART("yyyy", @[User::LastInsertDate]) 
+ "-" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mm", @[User::LastInsertDate]), 2)
+ "-" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("dd", @[User::LastInsertDate]), 2) 
+ " " + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("hh", @[User::LastInsertDate]), 2) 
+ ":" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("mi", @[User::LastInsertDate]), 2)
+ ":" + RIGHT("0" + (DT_STR, 2, 1252) DATEPART("ss", @[User::LastInsertDate]), 2) 

单击“评估表达式”时,您将在“评估值”部分中看到带有日期时间值的字符串。

希望有帮助。

Corrected


0
投票

有一个选项可以以字符串格式存储变量@[User::LastInsertDate]。 在写入 @[User::LastInsertDate] 时,您可以使用 CONVERT 函数确保正确的格式,例如:

convert(varchar ,@dt ,25) as TS;

然后您可以将变量与查询连接起来:

"SELECT COLUMN1, COLUMN2 FROM TABLENAME WHERE DATE_INSERTED > '" + @[User::LastInsertDate] + "'"
© www.soinside.com 2019 - 2024. All rights reserved.