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

标签 sql sql-server parameters ssis ssis-2008

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

当我尝试运行它时,出现错误:

Syntax error, permission violation, or other nonspecific error.

当我将 SQL 命令文本中的 ? 更改为 1 时,代码运行正常。那么我错过了什么?

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
...

屏幕截图

Program code

最佳答案

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

Incorrect syntax near ')'.

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

参数数据类型与变量数据类型

基于官方OLEDB Source - Documentation:

The parameters are mapped to variables that provide the parameter values at run time. The variables are typically user-defined variables, although you can also use the system variables that Integration Services provides. If you use user-defined variables, make sure that you set the data type to a type that is compatible with the data type of the column that the mapped parameter references.

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

因此,当您在 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. 添加字符串类型的变量(示例:@[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 源中,从变量中选择 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 

查询解析成功

enter image description here

关于sql - 数据流任务中的 SSIS 变量使用不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54958451/

相关文章:

mysql - 检索 MySQL 中每列应用 'DISTINCT' 的两列

sql - 如何在Postgres的create index语句中使用嵌套查询的输出

mysql - MySQL 与 SQL Server 的排序问题

c - 使用这个参数的目的是什么,int (*cmp) (void*, void*)

java - 将 SQL 连接传递给 ActionListener(线程)

sql - 返回行集并在 SQL Server 中的 "IN"子句中设置变量

c# - 如何将 mongo ObjectID 存储到 SQL Server 中?

sql-server - sql排序依据?您如何选择添加的最后 25 行?

matlab - 将几个 'Name, Value' 参数传递给 MATLAB 函数

c# - C#中如何将参数传递给另一个进程