繁体   English   中英

数据流中的SSIS变量任务使用不正确

[英]SSIS Variable in Data Flow Task used incorrectly

在SSIS包中,我有几个数据流任务,我想使用一个名为KOERSEL的输入全局变量来及时返回并专门调用数据集。

当我尝试运行它时,我收到错误:

语法错误,权限违规或其他非特定错误。

当我改变? 1在SQL命令文本,代码运行良好。 那我错过了什么?

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET, GETDATE()), '-04:00')
DECLARE @interval INT = ?
SET @interval = -1 * @interval
DECLARE @DATE_OPG DATE
SELECT @DATE_OPG = A.DWH_PR_DATO
FROM TABLE AS A
WHERE YEAR(A.DWH_PR_DATO)=YEAR(DATEADD(MONTH,@interval,@dt)) AND
      MONTH(A.DWH_PR_DATO)=MONTH(DATEADD(MONTH,@interval,@dt)) 
ORDER BY A.DWH_PR_DATO DESC

SELECT DISTINCT COLUMN 1,
                COLUMN 1,
                COLUMN 1,
FROM TABLE 1
WHERE DATE_OPG=@DATE_OPG
UNION ALL
SELECT DISTINCT COLUMN 2,
                COLUMN 2,
                COLUMN 2,
FROM TABLE 2
WHERE DATE_OPG=@DATE_OPG
...

截图

程序代码

我不认为以下错误是真正的问题。

')'附近的语法不正确。

查询解析器无法解析查询,因为您在问号前添加了减号? 在这个答案中,我将尝试澄清您所看到的错误的主要原因。

参数数据类型与可变数据类型

基于官方OLEDB来源 - 文档

参数映射到在运行时提供参数值的变量。 变量通常是用户定义的变量,但您也可以使用Integration Services提供的系统变量。 如果使用用户定义的变量,请确保将数据类型设置为与映射的参数引用的列的数据类型兼容的类型。

这意味着参数数据类型与变量数据类型无关。

所以当你使用-? 在SQL命令内部,即使查询解析器映射到整数变量,它也无法识别参数元数据。

您可以在下面的链接中查看我的答案,其中包含许多有关实验的详细信息:


解决问题

(1)强制参数数据类型

尝试使用CAST()函数强制参数数据类型,并以与声明@dt相同的方式将其分配给变量:

DECLARE @interval INT = CAST(? as INT)
--If you want to get a negative number else ignore the row below
SET @interval = -1 * @interval
DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET,GETDATE()),'-04:00');
DECLARE @DATE_OPG DATE;
SELECT @DATE_OPG = DWH_PR_DATEO
FROM TableName
WHERE YEAR(DWH_PR_DATO) = YEAR(DATEADD(MONTH,@interval ,@dt)) AND
MONTH(DWH_PR_DATO) = MONTH(DATEADD(MONTH,@interval ,@dt))
ORDER BY DWH_PR_DATO DESC

(2)使用表达式

您可以在构建SQL命令时使用表达式:

  1. 添加string类型的变量(例如: @[User::strQuery]
  2. 在此变量中定义表达式:

     "DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET,GETDATE()),'-04:00'); DECLARE @DATE_OPG DATE; SELECT @DATE_OPG = DWH_PR_DATEO FROM TableName WHERE YEAR(DWH_PR_DATO) = YEAR(DATEADD(MONTH,-" + @[User::KOERSEL] + ",@dt)) AND MONTH(DWH_PR_DATO) = MONTH(DATEADD(MONTH,-" + @[User::KOERSEL] + ",@dt)) ORDER BY DWH_PR_DATO DESC" 
  3. 在OLEDB Source中从变量中选择SQL Command并选择@[User::strQuery]


实验

我使用AdventureWorks数据库尝试了类似的查询:

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET(CONVERT(DATETIMEOFFSET, GETDATE()), '-04:00')
DECLARE @interval INT = CAST(? as INT)
SET @interval = -1 * @interval
DECLARE @DATE_OPG DATE
SELECT @DATE_OPG = A.[ModifiedDate]
FROM [AdventureWorks2016CTP3].[HumanResources].[Employee] AS A
WHERE YEAR(A.[ModifiedDate])=YEAR(DATEADD(MONTH,@interval,@dt)) AND
      MONTH(A.[ModifiedDate])=MONTH(DATEADD(MONTH,@interval,@dt)) 
ORDER BY A.[ModifiedDate] DESC

SELECT * FROM [AdventureWorks2016CTP3].[HumanResources].[Employee]
WHERE [ModifiedDate] = @DATE_OPG 

并且查询已成功解析

在此输入图像描述

而不是-? 使用以下逻辑:

-1 * (CAST(? as int))

如果您只想将变量作为参数传递而没有负号,那么只需使用:

(CAST(? as int))

您不能为参数指定负号,因为它会导致一些冲突,因为查询解析器将无法定义参数数据类型。

如果仍然抛出异常,请检查以下链接是否包含变通方法:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM