2009-11-21 2 views
4

열에 데이터베이스에 이미있는 값이 포함되어 있지 않으면 열에 삽입 또는 업데이트 작업을 수행하는 저장 프로 시저를 만들려는 경우 COUNT (필드) = 0이거나 COUNT (필드) = 0 또는 1 때 업데이트 그리고 이러한 작업 중 하나를 수행할지 여부를 알고 있어야합니다. 업데이트가 작동하지 않으므로 COUNT not Exists를 사용하여 문제를 해결하십시오.저장 프로 시저 업데이트 및 삽입

ASP.net에서 일하고 있습니다. 고유 제한을 사용하지 않고 고유하게 유지해야하는 테이블의 두 열이 있습니다. 업데이트에

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

이제 쿼리/@id

+0

입니까? – JohnIdol

+0

그리고 이미 시도한 것은 무엇입니까? –

+0

예 SQL 서버에 대해 얘기하고 있습니다 –

답변

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

EXISTS가 PK를 쿼리하여 잠시 동안 다른 사용자가 INSERT를 수행 할 가능성이 없도록 잠글까요? 그렇지 않다면 EXISTS가 행을 찾지 못하도록하는 가능성이 있지만 그 행이 이미 삽입 되었기 때문에 후속 INSERT가 실패합니다. 나는 WRT 격리 수준, 그러므로 내 질문을 모르겠다. – Kristen

+0

Exists도 업데이트되지 않습니다. 사용자가 레코드를 업데이트하고 이미 데이터베이스에있는 값을 입력하면 사용자가 올바르지 않은 업데이트 작업을 수행 할 수 있다고 가정합니다. –

0

의 기준으로 FIELD2 @ 필드 1 & @ 트릭을 할 것입니다 이런 종류의 접근법을 삽입 : 그래서 나는이 같은 절차를합니다. @AlreadyExisted는 sproc의 OUTPUT 매개 변수가 될 수 있습니다. 호출 코드가 반환되면 확인합니다.

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에서 일하고 있습니다. 고유 한 제약 조건을 사용하지 않고 고유하게 유지해야하는 테이블의 열이 tw0 개 있습니다. 그래서이 같은 프로 시저를 원한다. proc usp_checkall @ field1 varchar (20), @ field2 varchar (20), @ ID int, @ cunt int output을 생성한다. @ field1, @ field2를 @ id –

1

사용 : SQL 서버, MySQL은, 오라클, 포스트 그레스에서 작동

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

. 필요한 것은 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) 

가 확인하려면 SQL Server를 사용하는 경우 @@ ROWCOUNT에 따라 값을 얻는다. Oracle을 사용하는 경우 SQL % ROWCOUNT를 사용하십시오. SQL Server 2008을 가지고 있다면

8

, 당신은 또한 시도 할 수 있습니다 :이 SQL 서버는

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

Sql2008의 MERGE 구문 +1. –