我有一个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)
看起来tab1
的第一列是INT
类型,可能是主键。您没有告诉INSERT要插入哪些列,因此INSERT期望按照已定义的顺序为所有tab1
s列提供信息。结果是它试图将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值。