Error : Value does not fall within the expected range in delete query?

Error : Value does not fall within the expected range in delete query?

我有一个执行 sql 任务,它将数据插入 table,但在此之前我需要确保特定日期没有可用数据。我们有一个 table,我们在其中定义我们想要数据的日期,并且我们正在使用 ssis 变量 'Date' 获取该特定日期。今天我试图加载数据 dor '2015-05-10'。但它给了我错误,如“[执行 SQL 任务] 错误:“值不在预期范围内。”下面是我的执行 sql 任务查询:

delete from STG_Shipped_Invoiced
where Transaction_Date=?


INSERT INTO STG_Shipped_Invoiced (div_Code, inv_inv_id, tot_Net_Amt, 
trans_date, trans_type, Created_date, Transaction_Date)
select inv.DIV_CODE as Div_Code, inv.INV_ID as inv_inv_id, inv.TOT_NET_AMT as Tot_Net_Amt,
inv.TRANS_DATE as trans_date, inv.TRANS_TYPE as trans_type,  Getdate() as Created_date, 
CONVERT(DATE,inv.TRANS_DATE) as Transaction_Date 
from inv inv 
where CONVERT(DATE,inv.TRANS_DATE)=? and inv.TRANS_TYPE<>'CM' 
And inv.INV_ID in (select distinct INV_ID from inv_shp inv_ship where WHSE_CODE='WPP')
order by 1 asc, 2 asc


SELECT @@ROWCOUNT as NoOfRecords

这里我定义了一个变量'Date',我们在其中传递日期。我的删除查询有什么问题吗?

我过去曾在无意中尝试将多个值填充到一个只需要一个的参数时看到过此错误。您的脚本正在应用“?”两次,但是根据你的描述,你只是传递给它一个参数,就是变量"Date"。查看 SQL 任务编辑器中的参数映射。预期的范围错误可能是由于这种不一致造成的。

  1. 您可以将 SQL 更改为其中的存储过程?作为单个参数或

    传递给它一次

    执行 dbo.mystoredprocedure ?

  2. 修改当前的 SQL 这样 ?设置为等于新变量@Date。然后在您当前的 SQL 中替换 ?与@Date。这样它只通过一次。

DECLARE @Date DateTime
SET @DATE = ?

DELETE FROM STG_Shipped_Invoiced WHERE Transaction_Date=@Date INSERT INTO STG_Shipped_Invoiced ( div_Code, inv_inv_id, tot_Net_Amt, trans_date, trans_type, Created_date, Transaction_Date) SELECT inv.DIV_CODE as Div_Code, inv.INV_ID as inv_inv_id, inv.TOT_NET_AMT as Tot_Net_Amt, inv.TRANS_DATE as trans_date, inv.TRANS_TYPE as trans_type, Getdate() as Created_date, CONVERT(DATE,inv.TRANS_DATE) as Transaction_Date FROM inv inv WHERE CONVERT(DATE,inv.TRANS_DATE)=@Date AND inv.TRANS_TYPE<>'CM' AND inv.INV_ID IN (SELECT DISTINCT INV_ID FROM inv_shp inv_ship WHERE WHSE_CODE='WPP') ORDER BY 1 asc, 2 asc SELECT @@ROWCOUNT as NoOfRecords

现在您的 SQL 脚本正在寻找两个参数,但只提供了一个。第三个选项是在参数映射中为两个不同的参数定义 Date 变量两次,这样可以避免修改当前的 SQL。

我个人的建议是将您的 SQL 转换为存储过程并改为应用存储过程。这样,稍后在部署 SSIS 包后,您可以在存储过程中更新 SQL,而无需更新包。