将字符串追加到nvarchar类型的列中的现有值

300*_*300 1 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)
Run Code Online (Sandbox Code Playgroud)

现在', B',如果列注释的值为:,我想附加到列注释的值:

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

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

我尝试过的

UPDATE table_2 
SET notes=notes+', '+'B' 
WHERE col_percent = 5.8
Run Code Online (Sandbox Code Playgroud)

但这会引发错误:

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

当我尝试

UPDATE table_2 
SET notes=notes+', '+'B' 
WHERE col_percent = 9.9
Run Code Online (Sandbox Code Playgroud)

它显示(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
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

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

[notes] [nvarchar] NULL
Run Code Online (Sandbox Code Playgroud)

您尚未包括长度,因此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;
Run Code Online (Sandbox Code Playgroud)

或者,更好的是:

UPDATE table_2
    SET notes = notes + ', ' +'B'
    WHERE col_percent = 9.9 AND notes IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)