Как сделать несколько операторов выбора в виде SQL и изменить данные через представление?

У меня есть несколько заявлений, которые я хотел бы сделать

CREATE VIEW dbo.vw_customers_addresses_services_servicetanks

Вот мои ВЫБОРНЫЕ ЗАЯВЛЕНИЯ:

SELECT * FROM Customers
     WHERE EXISTS
      (SELECT * FROM Addresses
       WHERE Addresses.OwnerId = Customers.Id
       AND Addresses.OwnerId = 97587
       AND Addresses.TenantId = 1013);


(SELECT * FROM Addresses
     WHERE Addresses.OwnerId = 97587
     AND Addresses.TenantId = 1013
     AND Addresses.Type = 'Delivery');


SELECT * FROM dbo.Services
     WHERE EXISTS
      (SELECT * FROM Addresses
       WHERE Addresses.Id = Services.AddressId
       AND Addresses.OwnerId = 97587
       AND Addresses.TenantId = 1013);

(SELECT ServiceTanks.*
     FROM ServiceTanks, Addresses, Services
      WHERE Services.Id = ServiceTanks.ServiceId
      AND Addresses.Id = Services.AddressId
      AND Addresses.OwnerId = 97587
      AND Addresses.Tenantid = 1013)

который сейчас работает как оператор множественного выбора. Однако моя цель состоит в том, чтобы ИЗМЕНИТЬ ДАННЫЕ ЧЕРЕЗ SQL-ПРОСМОТР, где я могу просто сделать быстрое ОБНОВЛЕНИЕ РЕЗУЛЬТАТА AddressID из третьего оператора выбора с использованием SSMS и магии EDIT TOP X ROWS.

Когда я помещаю свой CREATE VIEW над первым оператором select, он дает большой красный волнистый круг с "Неверным синтаксисом:" CREATE VIEW "должен быть единственным оператором в пакете".

Я сплю или это можно сделать так, как я описал?

1 ответ

Документы... https://docs.microsoft.com/en-us/sql/relational-databases/views/modify-data-through-a-view

Пример кода для изменения данных через представление, которое имеет много базовых операторов выбора (таблиц).

--tables
if exists (select * from sys.tables where name = 'table1')
    drop table table1
go

if exists (select * from sys.tables where name = 'table2')
    drop table table2
go

create table table1 (tkey1 int identity(1,1), fk int, name varchar(32));
create table table2 (tkey2 int identity(1,1), name varchar(32));
--data
insert into table2 (name) values ('MS')
insert into table2 (name) values ('OSS')
insert into table2 (name) values ('Oracle')
insert into table1 (fk, name) values (3, 'SQL')
insert into table1 (fk, name) values (1, 'postgreSQL')
insert into table1 (fk, name) values (2, 'mySQL')
go

if exists (select * from sys.views where name ='vw')
    drop view vw
go
create view vw
as
select t1.tkey1, t1.fk, t1.name as t1_name, t2.tkey2, t2.name as t2_name from table1 t1 inner join table2 t2 on t1.fk = t2.tkey2
go

select * from vw
go

begin tran
update vw set fk = 2 where fk = 1
update vw set fk = 1 where fk = 3
update vw set fk = 3 where fk = 2
select * from vw
rollback tran

begin tran
update vw set t2_name = 'OSS' where fk = 1
update vw set t2_name = 'MS' where fk = 3
update vw set t2_name = 'Oracle' where fk = 2
select * from vw
commit tran
Другие вопросы по тегам