【问题标题】:Arithmetic overflow nvarchar算术溢出 nvarchar
【发布时间】:2020-12-04 06:09:44
【问题描述】:

我有一张桌子:

CREATE TABLE [dbo].[TABLE]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CHARG] [nchar](255) NOT NULL,
    [MATNR] [nchar](30) NOT NULL,
    [VLTYP] [nchar](30) NOT NULL,
    [VLPLA] [nchar](30) NOT NULL,
    [NLTYP] [nchar](30) NOT NULL,
    [NLPLA] [nchar](30) NOT NULL,
    [BDATU] [nchar](30) NOT NULL,
    [DATES] [nchar](30) NOT NULL,
    [TIMES] [nchar](30) NOT NULL,
    [TIMESTAMP] [datetime] NOT NULL,
)

我使用这个 SQL 查询:

SELECT * 
FROM 
    (SELECT 
         [ID], [CHARG], [MATNR], [VLTYP], [VLPLA],
         [NLTYP], [NLPLA], [BDATU], [DATES], 
         [TIMES], [TIMESTAMP],
         RANK() OVER (PARTITION BY NLPLA ORDER BY timestamp DESC) AS lastN,
         CASE WHEN NLPLA ='X-X-1' THEN (CAST(NLPLA as nchar(6))+'-'+(CAST(RANK() OVER (PARTITION BY NLPLA ORDER BY TIMESTAMP desc )as nchar(3))))
            ELSE (CAST(NLPLA as nchar(6))+'-'+(CAST(RANK() OVER (PARTITION BY NLPLA ORDER BY TIMESTAMP ASC)as nchar(3)))) End as LINESKATE,
         CASE  WHEN NLPLA = 'X-X-1' THEN 'X-X-1'
        WHEN MATNR <> FIRST_VALUE(MATNR) OVER (PARTITION BY NLPLA ORDER BY timestamp) AND NLPLA !='X-X-1'
            THEN 'WRONG'
        WHEN NLPLA LIKE 'DIFF%' THEN 'Different'
        WHEN TIMESTAMP = LAST_VALUE(TIMESTAMP) over (partition by MATNR order by timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AND NLPLA !='X-X-1'
             THEN 'LAST'
        ELSE 'RIGHT' 
        END as status_text
     FROM [DB].[dbo].[TABLE]
)t
WHERE (NLPLA = 'X-X-1' AND lastN <= 6) OR (NLPLA !='X-X-1')

我有时会收到一条错误消息:

将表达式转换为数据类型 nvarchar 时出现算术溢出错误。

是否有什么问题,例如,导致此问题的表设计或以某种方式修改了 SQL 查询?

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    您需要在下面的转换中为NCHAR 提供足够的长度。我认为排名已经超过了 999。

     (CAST(NLPLA as nchar(6))+'-'+(CAST(RANK() OVER (PARTITION BY NLPLA ORDER BY TIMESTAMP ASC)as nchar(3)))) End as LINESKATE, -- you have defined NCHAR(3) here
    
    

    【讨论】: