SQL - вместо INSERT и временной переменной - PullRequest
0 голосов
/ 20 марта 2019

я делаю этот триггер для вставки нового PersonID в таблицу клиентов:

CREATE TRIGGER [dbo].[tr_insert_PersonID]  ON  [dbo].[CustomersTB]

instead of INSERT 
as

BEGIN
    declare @PersonID int;
    select @PersonID = (select PersonID from inserted)

    if  (@PersonID<=999999999) and
        (not EXISTS (Select PersonID From [dbo].[CustomersTB] where @PersonID = [dbo].[CustomersTB].PersonID))
    begin
        .
        .   
    end 
END

при вставке вручную одного PersonID это работает, но при попытке вставить из других таблиц я получаю эту ошибку:

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

указал на линию:

выберите @PersonID = (выберите PersonID из вставленного)

не могу понять, что и как это изменить

1 Ответ

3 голосов
/ 20 марта 2019

Наряду со всем, что было написано в комментариях до сих пор (последний комментарий в данный момент относится к ответу Дамьена на ISNUMERIC, отвечающему на вопрос, который вы не хотите задавать), похоже, вы используете триггер instead ofдля проверки - и в этом случае вы выбрали неправильный инструмент для задания.

За исключением очень специфических случаев, проверка должна выполняться с использованием ограничений.

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

Если вы хотите, чтобы он был числовым, используйте числовой тип данных.Если вы хотите, чтобы оно было целым числом, используйте int (или в случае чрезвычайно большого целого числа bigint).

Если вы хотите, чтобы оно было уникальным, добавьте уникальный индекс или уникальное ограничение к нему, или подумайте, должен ли он быть первичным ключом таблицы (который является уникальным по определению).

Если вы хотите егочтобы быть числом, состоящим хотя бы из 9 цифр, добавьте контрольное ограничение , которое отклонит любое значение в 100,000,000.

...