SQL: обновить и вставить с условием - PullRequest
0 голосов
/ 23 апреля 2019

Я хотел бы знать, возможно ли это.Я хотел бы обновить запись, только если typeId равен моему значению, и добавить запись в таблицу B, если это так.

TableA:

id (PK, int)  
typeId (int)

TableB:

id (PK, int)  
tableAId (FK, int)
note (nvarchar)

Мой SQL-скрипт:

UPDATE [dbo].[TableA] 
   SET [TypeId] = CASE 
     WHEN [TypeId] = 4 THEN 6 AND
        (INSERT INTO [dbo].[TableB] ([tableAId],[note])
         VALUES ([dbo].[TableA].Id,'type has changed'))
     ELSE [Id]
END

Вышеприведенный скрипт выглядит так, как будто я хочу достичь, но, очевидно, он неверен.Как я могу сделать несколько вещей в моем случае?Обновить значение и вставить запись с текущим идентификатором?

Образец данных:

Table A (id, typeId)
1, 4
2, 5
3, 2

Table B (id, tableAid, note)
1, 1, 'note1'
2, 1, 'note2'
3, 2, 'note1'

Должно стать:

Table A (id, typeId)
1, 6
2, 5
3, 2

Table B (id, tableAid, note)
1, 1, 'note1'
2, 1, 'note2'
3, 2, 'note1'
4, 1, 'type has changed'

1 Ответ

0 голосов
/ 23 апреля 2019

Попробуйте использовать OUTPUT предложение.

Тестовые таблицы и данные:

CREATE TABLE A(
  id int NOT NULL PRIMARY KEY,
  typeId int NOT NULL
)

INSERT A(id,typeId)VALUES(1, 4),(2, 5),(3, 2)

CREATE TABLE B(
  id int NOT NULL IDENTITY PRIMARY KEY,
  tableAid int NOT NULL REFERENCES A(id),
  note varchar(50) NOT NULL
)

SET IDENTITY_INSERT B ON
INSERT B(id,tableAid,note)VALUES(1, 1, 'note1'),(2, 1, 'note2'),(3, 2, 'note1')
SET IDENTITY_INSERT B OFF

Использование OUTPUT демо:

DECLARE @LogTable TABLE(tableAid int,note varchar(50))

UPDATE A
SET
  typeId=6
OUTPUT inserted.id,'type has changed'
INTO @LogTable(tableAid,note)
WHERE typeID=4

INSERT B(tableAid,note)
SELECT tableAid,note
FROM @LogTable

Если вы уроните внешний ключ в таблицу B, вы можете использовать OUTPUT непосредственно в таблицу B без @LogTable:

-- table B without FOREIGN KEY
CREATE TABLE B(
  id int NOT NULL IDENTITY PRIMARY KEY,
  tableAid int NOT NULL, --REFERENCES A(id),
  note varchar(50) NOT NULL
)

-- only one UPDATE with OUTPUT
UPDATE A
SET
  typeId=6
OUTPUT inserted.id,'type has changed'
INTO B(tableAid,note)
WHERE typeID=4
...