将字符串附加到nvarchar

时间:2019-06-14 19:47:30

标签: sql sql-server-2016

我在Microsoft SQL Server 2016 DB中有一个数据库表“ table_2”。

CREATE TABLE table_2
(
    [created_date] [date] NULL,
    [complete_hour] [int] NULL,
    [col_percent] [float] NULL,
    [notes] [nvarchar] (400)
)

INSERT INTO table_2
VALUES ('2017-05-31', 10, 5.8, 'A'),
       ('2019-06-14', 11, 9.9, NULL)

现在,如果列注释的值为:

,我想在列注释的值后面附加', B'

  1. NOT NULL和
  2. 不可为空
  3. 不是'B'

如果列注释的值为NULL,我想在列注释中添加/插入/添加'B'。

我尝试过的事情:

UPDATE table_2 
SET notes=notes+', '+'B' 
WHERE col_percent = 5.8

但是会引发错误:

  

8152消息,第16级,状态13,第14行
  字符串或二进制数据将被截断。

当我尝试

UPDATE table_2 
SET notes=notes+', '+'B' 
WHERE col_percent = 9.9

它显示(1 row affected),但我看到相同的数据,并且列注释在第二行中仍为NULL。

我环顾四周,似乎将列注释的数据类型从nvarchar更改为varchar(50)可以解决此问题。 (我已经测试过了)但是在实际情况下,我无法更改数据类型。

问题:如何在不更改列注释的数据类型的情况下做到这一点?

更新:将注释列声明为[notes] [nvarchar] (400)。这解决了列注释中非空值的问题。

但是对于NULL值(例如col_percent = 9.9),它显示(1 row affected),但数据保持不变。

当notes列为NULL时,Zeina的解决方案确实会更新,但也会添加前导逗号。

我最终使用的解决方案(可能有比这更好的解决方案):

UPDATE table_2  
   SET notes = CASE
                   WHEN notes = 'B'   THEN 'B'
                   WHEN notes IS NULL THEN 'B' 
                   WHEN notes = ''    THEN 'B' 
                   ELSE notes+', '+'B'
               END 
 WHERE col_percent = 5.8

2 个答案:

答案 0 :(得分:4)

必须更改notes的类型。当前,您已将notes定义为:

[notes] [nvarchar] NULL

您尚未包括长度,因此SQL Server使用默认长度。在这种情况下,默认长度为1,因此您只能在该列中存储一个字符。

然后使用NULL处理CASE值:

UPDATE table_2
    SET notes = (CASE WHEN notes IS NOT NULL THEN notes + ', ' +'B'
                 END)
    WHERE col_percent = 9.9;

或者,更好的是:

UPDATE table_2
    SET notes = notes + ', ' +'B'
    WHERE col_percent = 9.9 AND notes IS NOT NULL;

答案 1 :(得分:1)

UPDATE table_2 SET notes=ISNULL(notes, '') + ', B' WHERE col_percent=9.9

由于与其他任何值一起使用的NULL都被视为NULL。因此我们必须首先为NULL单元格设置一个默认值,然后将B附加到该值。