我有一个select语句,它将我的日期列转换为varchar,然后转换为在SSMS中工作的int,并给出了我想看到的结果。在SSIS中,它开始抛出错误,因此我决定在select语句中使用表变量并将数据发送到那里,然后使用该数据将其插入到主表中,使用SSIS数据流。
我的select语句给出错误:
Msg 206, Level 16, State 2, Line 71
Operand type clash: int is incompatible with date
我的Select语句是:
DECLARE @Order TABLE (
[OrderCode] [INT] NOT NULL,
[PersonCode] [BIGINT] NOT NULL,
[OrderDateTimeBase] [INT] NULL,
[OrderlineCreateDate] [INT] NOT NULL,
[OrderlineDateTimeBase] [INT] NULL,
[OrderlineDateBase] [DATE] NULL,
[BackOrderPromiseDate] [INT] NULL,
[CancelDate] [INT] NULL,
[DespatchedDate] [INT] NULL,
[ReturnDate] [INT] NULL,
[ExchangeDate] [INT] NULL
);
INSERT INTO @Order
SELECT
CAST(LEFT(o.[personCode]
, CHARINDEX('~', o.[personCode]) - 1) AS BIGINT) AS 'PersonCode'
, CONVERT(INT, CONVERT(VARCHAR(8), o.[OrderDatetimeBase], 112)) AS 'OrderDateTimeBase'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[OrderlineCreateDate], 112)) AS 'OrderlineCreateDate'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[OrderlinedatetimeBase], 112)) AS 'OrderlinedatetimeBase'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[OrderlineDateBase], 112)) AS 'OrderlineDateBase'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[BackOrderPromiseDate], 112)) AS 'BackOrderPromiseDate'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[CancelDate], 112)) AS 'CancelDate'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[DespatchedDate], 112)) AS 'DespatchedDate'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[ReturnDate], 112)) AS 'ReturnDate'
, CONVERT(INT, CONVERT(VARCHAR(8), ol.[ExchangeDate], 112)) AS 'ExchangeDate'
FROM dbo.A ol
INNER JOIN dbo.B o ON o.orderID = ol.orderID;
SELECT * FROM @Order
答案 0 :(得分:4)
您的某些字段(例如 OrderlineCreateDate )不属于date
但int
类型。但CONVERT(VARCHAR(8), field, 112)
期望字段为date
,因此存在数据类型冲突。
如果这些字段确实属于int
类型,可能会想知道为什么要将这些字段转换为varchar
,然后再将其转换为int
。
然后将它们插入到一个表格中,期望它们为date
。
答案 1 :(得分:1)
您的问题的实质内容已得到解决,但我还要补充一点,我遇到了这个错误,因为我的开头是一个只包含NULL的日期列。
当我试图稍后插入该列的数据时,我猜想期望实际日期值的列将NULL解释为int(或以其他方式混淆)。我不确定NULL是否会每次都会导致此错误,但如果您发现此错误,则需要检查该错误。