【问题标题】:Error : Value does not fall within the expected range in delete query?错误:删除查询中的值不在预期范围内?
【发布时间】:2015-05-30 02:20:21
【问题描述】:

我有一个执行 sql 任务,它将数据插入到表中,但在此之前我需要确保特定日期没有可用的数据。我们有一个表格,我们在其中定义我们想要数据的日期,并且我们正在使用 ssis 变量“日期”获取该特定日期。今天我试图加载数据'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

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

【问题讨论】:

    标签: ssis ssis-2012


    【解决方案1】:

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

    1. 您可以将 SQL 更改为存储过程,其中?作为单个参数传递给它一次或

      EXEC dbo.mystoredprocedure ?

    2. 修改当前 SQL 以便 ?设置为等于一个新变量@Date。然后在您当前的 SQL 替换中?与@日期。这种方式只通过一次。

    声明 @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 脚本正在寻找两个参数,并且只提供了一个。第三个选项是在 Parameter Mappings 中为两个不同的参数定义两次 Date 变量,这样可以避免修改当前 SQL。

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

    【讨论】:

    • 感谢 user3662215,您的解释真的对我有用。我按照您的要求尝试了存储过程(您的第一个建议)。感谢您宝贵的时间。
    猜你喜欢
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多