2009-11-21 5 views
4

Я хочу создать хранимую процедуру, которая выполняет операцию вставки или обновления в столбце, если этот столбец не содержит значения, которое уже существует в базе данных, оно должно разрешить вставку, когда COUNT (поле) = 0 или update, когда COUNT (поле) = 0 или 1 И я должен знать, что любая из этих операций выполняется или нет. Пожалуйста, решите мою проблему, используя COUNT, не существует, потому что это не будет работать для UPDATE.Обновить и вставить сохраненную процедуру

Я работаю в ASP.net. У меня есть два столбца таблицы, которые необходимо сохранить уникальными, не используя уникальное ограничение. Поэтому я хочу процедуру так:

create proc usp_checkall @field1 varchar(20), 
         @field2 varchar(20), 
         @ID int, 
         @count int output 

Теперь запрос на обновление/вставив @ FIELD1 & @ field2 на основе @id

+0

это SQL-сервер? – JohnIdol

+0

И что вы уже пробовали? –

+0

Да, я говорю о SQL-сервере –

ответ

0
if Exists select * from Yourtable WHere Your Criteria 
begin 
    update ... 
end 
else 
begin 
    insert ... 
end 
+0

Будет ли СУЩЕСТВУЕТ блокировать запрос PK, чтобы не было возможности другого пользователя сделать INSERT тем временем? Если нет, то существует вероятность того, что EXISTS не найдет строку, но последующий INSERT завершится неудачно, потому что строка уже вставлена ​​(к тому времени). Я не знаю ответа WRT на уровень изоляции, поэтому мой вопрос. – Kristen

+0

Exists также не будет работать для обновления. Предположим, если пользователь обновляет запись и вводит значение, которое уже существует в базе данных, тогда существует, что позволит пользователю выполнить операцию обновления, которая неверна. –

0

Такой подход будет делать трюк. @AlreadyExisted может быть параметром OUTPUT на sproc для вашего кода вызова, который будет проверяться после его возврата.

DECLARE @AlreadyExisted BIT 
SET @AlreadyExisted = 0 

IF EXISTS(SELECT * FROM YourTable WHERE YourField = @FieldValue) 
    BEGIN 
     -- Record already exists 
     SET @AlreadyExisted = 1 

     UPDATE YourTable 
     SET.... 
     WHERE YourField = @FieldValue 
    END 
ELSE 
    BEGIN 
     -- Record does not already exist 
     INSERT YourTable (YourField,....) VALUES (@FieldValue,.....) 
    END 
+0

Благодарим за ваш ответ. Но, будучи новичком, я все равно не могу заставить ваш ответ работать для меня. –

+0

Вы должны быть более конкретным, какая часть не работает? –

+0

Позвольте мне объяснить вам точный сценарий. Я работаю в ASP.net. У меня есть два столбца таблицы, которые необходимо сохранить уникальными, не используя уникальное ограничение. Таким образом, я хочу такую ​​процедуру .. create proc usp_checkall @ field1 varchar (20), @ field2 varchar (20), @ ID int, @ cunt int output Теперь ваш запрос об обновлении/вставке @ field1, @ field2 на основе @ id –

1

Использование:

INSERT INTO your_table 
    (column) 
VALUES 
    ([ your_value ]) 
WHERE NOT EXISTS (SELECT NULL 
        FROM your_table 
        WHERE t.column = [ your_value ]) 

Это будет работать на SQL Server, MySQL, Oracle, Postgres. Все, что нужно, это использовать соответствующую ссылку на переменную db. IE: для MySQL & SQL Server:

INSERT INTO your_table 
    (column) 
VALUES 
    (@your_value) 
WHERE NOT EXISTS (SELECT NULL 
        FROM your_table 
        WHERE t.column = @your_value) 

Чтобы увидеть, если что-то было вставлено, получить значение, основанное на @@ ROWCOUNT при использовании SQL Server. Используйте SQL% ROWCOUNT, если вы используете Oracle.

8

Если вам посчастливилось иметь SQL Server 2008, вы можете также попробовать:

MERGE dbo.SomeTable AS target 
    USING (SELECT @ID, @Field_1, @Field_2) AS source (ID, Field_1, Field_2) 
     ON (target.ID = source.ID) 
    WHEN MATCHED THEN 
     UPDATE SET Field_1 = source.Field_1, Field_2 = source.Field_2 
    WHEN NOT MATCHED THEN 
     INSERT (ID, Field_1, Field_2) 
     VALUES (source.ID, source.Field_1, source.Field_2) 
+0

+1 для синтаксиса MERGE в Sql2008. –

Смежные вопросы