为什么我得到错误datetime2与int冲突?

问题描述 投票:0回答:1

我有一个sp,将数据从一个表插入另一个表;当我运行它时,我得到第7行的操作数类型冲突(插入tab1);我有点困惑,因为我无法清楚地理解为什么会发生冲突;为了给你一些上下文,tab1.date是datetime2。任何人都可以帮我理解我做错了吗?

declare @report_start date = NULL  

SET @report_start = ISNULL(@report_start , DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)); --If the date it's null, sets it as the first day of the year

Truncate table tab1;

insert tab1
SELECT
    tab2.Date as Date,
    DATENAME(dw,tab2.Date) as [Day of the Week],
    '00' +RIGHT(CONVERT(CHAR(8),DATEADD(second,CAST(REPLACE([Spot Length],' secs','') AS INT),0),108),5) AS [Length of the Spot (Source)] ,
    CASE 
        WHEN '00' +RIGHT(CONVERT(CHAR(8),DATEADD(second,CAST(REPLACE([Spot Length],' secs','') AS INT),0),108),5) in ('0000:01 ','0000:02 ','0000:03 ','0000:04 ','0000:05 ','0000:06 ') THEN '0000:05'
        ELSE '0001:03'
    END as [Updated Length],
    CASE
        WHEN tab2.[Date]='2018-01-01' THEN '2018/1'
        ELSE CAST(YEAR(tab2.[Date]-1) AS VARCHAR(4))+'/'+ cast( DATEPART( wk, tab2.[Date]-1) AS VARCHAR(2))
    END AS [Number of the Week],
    left(datename(month,tab2.[Date]),3)+'-'+ RIGHT(CONVERT(VARCHAR,YEAR(tab2.[Date])),2) AS [month]
from tab2
left join category on tab2.Brand = category.Campaign
where tab2.Date>=@report_start
and tab2.Date <> (select max(date) from tab2)
sql sql-server stored-procedures
1个回答
4
投票

看起来tab1的第一列是INT类型,可能是主键。您没有告诉INSERT要插入哪些列,因此INSERT期望按照已定义的顺序为所有tab1s列提供信息。结果是它试图将SELECT ... as [DATE]的值放入INT列。

要解决此问题,请在INSERT语句中指定列:

INSERT tab1 ([Date], [Day of the Week], ...)
SELECT
    tab2.Date as Date,
    DATENAME(dw,tab2.Date) as [Day of the Week],
    ...

如果我们现在正在跳过的INT确实是tab1的主键,那么如果使用IDENTITY(),这将有效。如果没有,那么你必须找到一种方法在SELECT中生成合适的PK值。

© www.soinside.com 2019 - 2024. All rights reserved.