算术溢出 nvarchar
Arithmetic overflow nvarchar
我有一个 table:
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')
我有时会收到一条错误消息:
Arithmetic overflow error converting expression to data type nvarchar.
例如,在 table 设计中是否有问题导致此问题或以某种方式修改了 SQL 查询?
您需要在下面的转换中为 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
我有一个 table:
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')
我有时会收到一条错误消息:
Arithmetic overflow error converting expression to data type nvarchar.
例如,在 table 设计中是否有问题导致此问题或以某种方式修改了 SQL 查询?
您需要在下面的转换中为 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