Добавить строку к существующему значению в столбце типа nvarchar - PullRequest
0 голосов
/ 14 июня 2019

У меня есть таблица базы данных "table_2" в БД Microsoft SQL Server 2016.

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. NOT пусто и
  3. NOT 'B'

Я хочу добавить / вставить / добавить 'B'в примечаниях к столбцам, если примечания к столбцам имеют значение NULL.

Что я пробовал:

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), но данные остаются неизменными.

Решение Zeina обновляется, когда столбец notes имеет значение NULL, но также добавляет начальную запятую.

Решение, которое я в итоге использовал (может быть, и получше):

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 ]

4 голосов
/ 14 июня 2019

Вы должны изменить тип 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 голос
/ 14 июня 2019
UPDATE table_2 SET notes=ISNULL(notes, '') + ', B' WHERE col_percent=9.9

Поскольку NULL в работе с любым другим значением считается NULL. поэтому сначала нужно поместить значение по умолчанию для пустых ячеек, а затем добавить к нему букву B.

...