SQL - Вставить в таблицу, если не существует - с существующими значениями NULL - PullRequest
0 голосов
/ 16 июня 2019

Мне нужно импортировать данные в SQL из Excel через пользовательское приложение .NET. Мне нужно избегать дублирования. Однако некоторые записи могут иметь значения NULL в определенных столбцах.

Я использую хранимые процедуры для реализации импорта, но я не могу предоставить "универсальное" решение, которое проверяет соответствие данных, если они существуют, или NULLS, если данные не завершаются.

Обратите внимание, что моя таблица деталей использует Identity PK, но записи импорта не будут включать его.

Ниже приведен пример (я не включил все столбцы для краткости):

CREATE PROCEDURE [dbo].[spInsertPart] 
    (@PartNo NCHAR(50), 
     @PartName NCHAR(50) = NULL,
     @PartVariance NCHAR(30) = NULL)
AS
BEGIN
    SET NOCOUNT OFF;

    IF NOT EXISTS (SELECT PartNo, PartVariance 
                   FROM Part 
                   WHERE PartNo = @PartNo AND PartVariance = @PartVariance)
    BEGIN
        INSERT INTO Part (PartNo, PartName, PartVariance)
        VALUES (@PartNo, @PartName, @PartVariance 
    END
END

Данные импорта могут включать или не включать PartVariance, а существующие записи могут (или не могут) также иметь значение NULL в качестве PartVariance.

Если оба значения равны NULL, то я получаю дубликат записи, который мне не нужен.

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

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Я думаю, что вам нужно предоставить четкую информацию о следующем, прежде чем на эти вопросы можно будет правильно ответить: Каковы столбцы, на основании которых выполняется «сопоставление» входящей записи со строками таблицы «Часть»?Это означает наличие одинаковых значений, для которых для столбцов требуется, чтобы остальные столбцы таблицы «Часть» были скорее «обновлены» входящими значениями, а новая запись «вставилась» в таблицу «Часть».

Учитывая, что только столбцы «PartNo» и «PartVariance» будут использоваться для «сопоставления», как видно в запросе, и только столбец PartVariance может иметь значение NULL, вот решение:

CREATE PROCEDURE [dbo].[spInsertPart] 
        (@PartNo NCHAR(50), 
         @PartName NCHAR(50) = NULL,
         @PartVariance NCHAR(30) = NULL)
    AS
    BEGIN
        SET NOCOUNT OFF;

        IF NOT EXISTS (
                        SELECT 1 
                        FROM   Part 
                        WHERE  PartNo = @PartNo 
                        AND    COALESCE(PartVariance, '') = COALESCE(@PartVariance, '')
                      )
        BEGIN
            INSERT INTO Part (PartNo, PartName, PartVariance)
            VALUES (@PartNo, @PartName, @PartVariance)
        END
    END

Примечание:- Вы упомянули, что только PartVarince может быть NULL.Если то же самое верно для PartNo, то COALESCE также может использоваться для сопоставления столбца PartNo.

0 голосов
/ 16 июня 2019

Ну, NULL - это проблема, когда речь идет о SQL Server.Вы не можете использовать проверки на равенство (=, <>), так как они оба возвратят unknown, что будет переведено как false.

Однако вы можете использовать комбинацию is null, or и and для получения желаемых результатов.

При использовании SQL Server 2012 или более поздней версии (в более старых версиях измените iif на case), вы можете сделать следующее:

IF NOT EXISTS (SELECT PartNo, PartVariance 
               FROM Part 
               WHERE IIF((PartNo IS NULL AND @PartNo IS NULL) OR (PartNo = @PartNo), 0, 1) = 1
               AND IIF((PartVariance IS NULL AND @PartVariance IS NULL) OR (PartVariance = @PartVariance), 0, 1) = 1)

Если оба PartNo и @PartNo равны нулю или содержат одно и то же значение (помните, null = любое другое значение будет оценено как ложное) - IIF вернет 0,в противном случае (имеется в виду, что столбец и переменная содержат разные значения, даже если одно из них равно нулю), он вернет 1.

Конечно, второй iif делает то же самое для другого столбца/ переменная комбинация.

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