SQL Функция - это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения - PullRequest
0 голосов
/ 05 января 2020
CREATE TABLE Property542
(
    PID INT IDENTITY(1,1) NOT NULL ,
    PropertyID AS RIGHT ('PID0000' + CAST(PID AS VARCHAR(10)), 10) PERSISTED 
          CONSTRAINT PK_Property PRIMARY KEY CLUSTERED,
    Availability BIT NOT NULL,
    P_Address VARCHAR(30) NOT NULL,
    MonthlyRent INT NOT NULL,
    Max_tenants INT NOT NULL,
    Type_of_Property VARCHAR(15) NOT NULL,
    --NIC varchar(10) FOREIGN KEY REFERENCES Landlord (NIC)
)

CREATE TABLE DetachedHouse768
(
    PropertyID VARCHAR(10) PRIMARY KEY,
    Dept VARCHAR(30) NOT NULL,
)

DECLARE @id TABLE (ID varchar(10))

INSERT INTO Property542
OUTPUT INSERTED.PropertyID INTO @id(ID)
VALUES (1, 'Kandy Road,Pasyala', 5000, 4, 'DetachedHouse'),
       (0, 'Kale para,Mathara', 7500, 2, 'Flat'),
       (1, 'No34,New Town,Kaluthara', 10000, 1, 'TerransedHouse');

INSERT INTO DetachedHouse768(PropertyID, Dept) 
VALUES ((SELECT ID FROM @id), 'room'),
       ((SELECT ID FROM @id), 'floor'),
       ((SELECT ID FROM @id), 'House');

Я получаю эту ошибку:

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения. Оператор был прерван.

Я хочу вставить больше данных за один раз, используя этот метод.

Ответы [ 3 ]

1 голос
/ 06 января 2020

Если вы намереваетесь вставить 3 DetachedHouse768 строки (комната, этаж, дом) для каждой ранее вставленной строки Property542, первичный элемент на DetachedHouse768 неверен. PropertyID само по себе не является уникальным, поэтому он может быть составным ключом на PropertyID и Dept, чтобы быть уникальным.

Ниже приведен пример INSERT ... SELECT с CROSS JOIN:

CREATE TABLE Property542
(
    PID int IDENTITY(1,1) NOT NULL ,
    PropertyID  AS RIGHT ('PID0000' + CAST(PID AS VARCHAR(10)), 10) PERSISTED 
          CONSTRAINT PK_Property PRIMARY KEY CLUSTERED,
    Availability bit NOT null,
    P_Address varchar(30) Not null,
    MonthlyRent int Not null,
    Max_tenants  int Not null,
    Type_of_Property varchar(15) Not null
);

CREATE TABLE DetachedHouse768
(
    PropertyID varchar(10),
    Dept varchar(30) Not null,
    CONSTRAINT PK_DetachedHouse768 PRIMARY KEY CLUSTERED(PropertyID,Dept)
);

DECLARE @id TABLE (ID varchar(10))
INSERT INTO Property542
OUTPUT INSERTED.PropertyID INTO @id(ID)
VALUES  (1,'Kandy Road,Pasyala',5000,4,'DetachedHouse')
       ,(0,' Kale para,Mathara',7500,2,'Flat')
       ,(1,'No34,New Town,Kaluthara',10000,1,'TerransedHouse');
INSERT INTO DetachedHouse768( PropertyID ,Dept)
SELECT ID, Dept
FROM @id
CROSS JOIN (VALUES
     ('room')
    ,('floor')
    ,('house')
) AS Depts(Dept);
1 голос
/ 06 января 2020
INSERT INTO DetachedHouse768(PropertyID, Dept) 
select i.ID, d.dept
from @id as i
cross join (values('room'), ('floor'), ('House')) as d(dept);
0 голосов
/ 06 января 2020

SELECT ID FROM @id в вашем втором операторе INSERT не является детерминированным c, что означает, что он не возвращает только 1 значение.

В этой части запроса (подзапрос), он ожидает только 1 значение, а ваш SELECT ID FROM @id этого не делает (очевидно) из-за отсутствия условий, которые можно установить с помощью предложения WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...