SQL / C # - ошибка первичного ключа в UPSERT - PullRequest
3 голосов
/ 01 сентября 2011

ОБНОВЛЕНИЕ (упрощенная проблема, убрал C # из проблемы)

Как мне написать UPSERT, который может распознавать, когда две строки одинаковы в следующем случае ...

SSMS

Посмотрите, как есть \ b [backspace] закодировано там (странный маленький символ)?SQL видит это как то же самое.В то время как мой UPSERT видит это как новые данные и пытается вставить, где должно быть ОБНОВЛЕНИЕ.

//UPSERT
    INSERT INTO [table]
    SELECT [col1] = @col1, [col2] = @col2, [col3] = @col3, [col4] = @col4
    FROM [table]
    WHERE NOT EXISTS
       -- race condition risk here?
       ( SELECT 1 FROM [table] 
       WHERE 
            [col1] = @col1 
        AND [col2] = @col2
        AND [col3] = @col3)

    UPDATE [table]
        SET [col4] = @col4
        WHERE 
        [col1] = @col1 
        AND [col2] = @col2
        AND [col3] = @col3

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Вам нужен знак @, в противном случае комбинация символов C # будет нажата.

C # определяет следующие последовательности символов:

\' - single quote, needed for character literals 
\" - double quote, needed for string literals 
\\ - backslash 
\0 - Unicode character 0 
\a - Alert (character 7) 
\b - Backspace (character 8) 
\f - Form feed (character 12) 
\n - New line (character 10) 
\r - Carriage return (character 13) 
\t - Horizontal tab (character 9) 
\v - Vertical quote (character 11) 
\uxxxx - Unicode escape sequence for character with hex value xxxx 
\xn[n][n][n] - Unicode escape sequence for character with hex value nnnn (variable length version of \uxxxx) 
\Uxxxxxxxx - Unicode escape sequence for character with hex value xxxxxxxx (for generating surrogates) 
2 голосов
/ 01 сентября 2011

После нескольких часов возни оказывается, что я в погоне за диким гусем.Проблема очень проста.Я вытащил свой UPSERT из популярного SO сообщения. Код не годится.Выбор иногда возвращает> 1 строки на INSERT.Тем самым, пытаясь вставить строку, затем вставьте эту же строку снова .

. Исправление - удалить FROM

    //UPSERT
    INSERT INTO [table]
    SELECT [col1] = @col1, [col2] = @col2, [col3] = @col3, [col4] = @col4
    --FROM [table] (Dont use FROM..not a race condition, just a bad SELECT)
    WHERE NOT EXISTS
       ( SELECT 1 FROM [table] 
       WHERE 
            [col1] = @col1 
        AND [col2] = @col2
        AND [col3] = @col3)

    UPDATE [table]
        SET [col4] = @col4
        WHERE 
        [col1] = @col1 
        AND [col2] = @col2
        AND [col3] = @col3

Проблема исчезла.

Спасибо всем вам.

1 голос
/ 01 сентября 2011

Вы используете '\u', который генерирует символ Unicode.

Ваш столбец - varchar, который не поддерживает символы Юникода. nvarchar будет поддерживать персонажа.

...