sql - 数据流任务中的 SSIS 变量使用不正确
问题描述
在 SSIS 包中,我有几个数据流任务,我想使用一个名为 KOERSEL 的输入全局变量及时返回并及时调用数据集。
当我尝试运行它时,我收到错误:
语法错误、权限违规或其他非特定错误。
当我在 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
...
截屏
解决方案
我不认为以下错误是真正的问题。
')' 附近的语法不正确。
查询解析器无法解析查询,因为您在问号前添加了减号?
。在这个答案中,我将尝试澄清您看到的错误的主要原因。
参数数据类型与变量数据类型
基于官方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 命令时使用表达式:
- 添加字符串类型的变量(示例
@[User::strQuery]
:) 在这个变量中定义一个表达式:
"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"
在 OLEDB Source 中,从变量中选择 SQL 命令并选择
@[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
并且查询解析成功
推荐阅读
- javascript - 什么是 gatsbyContentfulFluid?
- java - 如何在 mvn clean install 期间停止配置组件类 bean 函数以执行?
- django - 如何在 vue.js 和 django rest 框架中访问经过身份验证的登录用户
- html - 如何将图像放在文本旁边因为我想将图像放在一些文本旁边
- flutter - Open flutter screen from Native Method call
- python-asyncio - 如何在 Python 中将基于回调的库与 asyncio 库结合起来?
- typescript - 如何在 atom 中正确显示 emacs 编辑的文件?
- reactjs - Jest 使用 create-react-app 手动模拟:如何在测试中使用模拟值
- javascript - 如何在特定 laravel 刀片视图上扩展 vuejs 应用程序实例
- javascript - jQuery从包含的脚本中最近的按钮数据标签中获取