Как можно избежать сбоя всего пакета INSERT из-за 1 NULL - PullRequest
3 голосов
/ 16 февраля 2012

У меня есть таблица с первичным ключом и хранимая процедура, которую я использую для вставки в эту таблицу.Я не контролирую хранимую процедуру и не могу ее изменить.Иногда процедура возвращает много записей и 1 запись со значением NULL для столбца первичного ключа.В настоящий момент не удается вставить весь пакет новых строк.

Как настроить сбой кода или таблицы только на 1 строке со значением NULL, но разрешить вставку других строк?

Вот код теста:

    IF OBJECT_ID('tempdb..#tbl') IS NOT NULL
     DROP TABLE #tbl

    CREATE TABLE #tbl (
     col INT NOT NULL,
     CONSTRAINT PK_tbl PRIMARY KEY (col ASC)
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE  = OFF,
     IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
    )

    SET XACT_ABORT OFF

    --Imagine this is the procedure that cannot be edited
    insert into #tbl (col) values 
    (null), (1), (2)

    --Ideally, the table would have 1 and 2
    select * from #tbl

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

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

CREATE TRIGGER dbo.PreventNullsOnTableName
ON dbo.TableName
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT dbo.TableName SELECT col1 FROM inserted WHERE col1 IS NOT NULL;
END
GO

Вы также можете использовать GROUP BY col1 для предотвращения нарушений PK, но это зависит от того, хотите ли вы обработать это изящно или вызвать ошибку.

Вы также можете удалить ограничение NOT NULL и вместо PRIMARY KEY создать уникальный отфильтрованный индекс WHERE col1 IS NOT NULL.

0 голосов
/ 16 февраля 2012

Не иметь NOT NULL на col INT. Это все еще может быть PK, но это позволит только один ноль. Затем вы можете удалить пустую строку.

ОК, я ошибся, ПК не может быть нулевым. Но вы можете иметь нулевой уникальный некластеризованный индекс. Это принципиально ПК, но не кластеризованный. Если вставка имеет не более одного значения NULL, то вставка будет выполнена успешно, и вы сможете удалить 1 строку с нулевым значением.

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