我有一个执行sql任务,它将数据插入表中,但在此之前我需要确保没有可用于特定日期的数据。我们有一个表格,我们用它来定义我们想要数据的日期,我们使用ssis变量' Date'来获取该特定日期。今天我试图加载数据,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
在这里,我定义了一个变量&#39; Date&#39;,我们将传递日期。我在删除查询时有什么问题吗?
答案 0 :(得分:0)
我曾经在无意中尝试将多个值填充到只需要一个的参数时看到过这个错误。你的脚本正在应用“?”两次,但根据你的描述,你只传递一个参数,即变量“Date”。查看SQL任务编辑器中的参数映射。预期的范围误差可能是由于这种不一致。
您可以将SQL更改为存储过程吗?作为单个参数或
传递给它一次EXEC dbo.mystoredprocedure?
修改当前的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,而无需更新包。