Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将参数传递到OLE DB源_Sql_Sql Server_Ssis_Msbi - Fatal编程技术网

Sql 将参数传递到OLE DB源

Sql 将参数传递到OLE DB源,sql,sql-server,ssis,msbi,Sql,Sql Server,Ssis,Msbi,我是SSIS新手,在向OLEDB源传递参数时遇到问题。我想查询给定日期范围的数据 我有两个变量,数据类型为Date Time的variable1,该变量的值由表达式DATEADD(“day”,-1,GETDATE())设置。数据类型日期时间的变量2,变量值由表达式DATEADD(“day”,0,GETDATE())设置。 在OLE DB源中,数据访问模式设置为SQL命令,下面是SQL代码 Select Col1, col2, col3, col4, coldate where Col1 = 'a

我是SSIS新手,在向OLEDB源传递参数时遇到问题。我想查询给定日期范围的数据

我有两个变量,数据类型为Date Time的variable1,该变量的值由表达式
DATEADD(“day”,-1,GETDATE())
设置。数据类型日期时间的变量2,变量值由表达式
DATEADD(“day”,0,GETDATE())设置。

在OLE DB源中,数据访问模式设置为SQL命令,下面是SQL代码

Select Col1, col2, col3, col4, coldate where Col1 = 'abc' and  coldate between convert(varchar(10), ?, 101) and convert(varchar(10), ?, 101)
我已将参数映射为

参数0,用户::变量1,输入

参数1,用户::变量2,输入

当我点击预览时,我得到一个错误

“显示预览时出错

其他信息: 没有为一个或多个必需参数提供值。(Microsoft SQL Server本机客户端11.0)

当我调试任务时,我得到的错误是

[OLE DB源[38]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E21。 OLE DB记录可用。来源:“Microsoft SQL Server本机客户端11.0”Hresult:0x80040E21说明:“转换规范的字符值无效”

注意:coldate列的数据类型是datetime

请帮我解决这个问题。 我能够从OLE DB源中的变量使用数据访问模式SQL命令成功地进行查询,但被要求不要将数据访问模式用作SQL命令。
谢谢。

如果您确定您正确映射了变量,那么我建议您:

SSIS使用自己的数据类型。我在过去使用SSIS datetime时遇到过麻烦,因此每当我从SSIS中向TSQL语句传递变量时,我都会尝试只使用字符串(如果可能的话)

我建议将SSIS中的变量设置为字符串,这些字符串接收您试图筛选的日期值,并将其格式化。您可以在当前用于实现dateadd语句的同一语句中,将SSIS转换为字符串

SSIS变量表达式示例:

(DT_STR,4,1252) DatePart("yyyy",dateadd("day", -1, getdate())) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("m", dateadd("day", -1, getdate())),2) + "-" +
Right("0" + (DT_STR,4,1252) DatePart("d", dateadd("day", -1, getdate())),2)  
然后简化TSQL语句,如下所示:

Select Col1, col2, col3, col4, coldate 
where Col1 = 'abc' 
and coldate between ? and ?

旁注。当您以这种方式传递TSQL语句时。SQL Server知道,当使用日期列和BEVER语句时,作为字符串传递的边界应转换为SQL Server列类型datetime。中间层仍将使用适当的索引(如果可用)。它不会成为隐式转换的牺牲品,隐式转换可能会妨碍在接收不正确类型进行比较的其他查询中正确选择索引。您可以通过show execution plan在SSMS中对此进行测试。

DATEADD的语法是
DATEADD(day,-1,GETDATE())
如果在SSIS中使用语法DATEADD(day,-1,GETDATE()),我会收到一个错误。如果ColDate是datetime,为什么要在查询中将参数转换为varchar?如果去掉转换函数会发生什么?很好-很高兴听到。正如我所说,我在SSIS数据类型转换方面也遇到了问题。