행이 있는지 확인하고, 없으면 삽입합니다.

테이블의 행을 업데이트하는 T-SQL 저장 프로시저를 작성해야 합니다. 행이 존재하지 않으면 행을 삽입합니다. 이 모든 단계는 트랜잭션으로 래핑됩니다.

이것은 예약 시스템을 위한 것이므로 원자적이고 신뢰할 수 있어야 합니다. 트랜잭션이 커밋되고 항공편이 예약된 경우 참을 반환해야 합니다.

T-SQL을 처음 사용하는데 @@rowcount를 어떻게 사용하는지 잘 모르겠습니다. 이것이 제가 지금까지 작성한 내용입니다. 제가 올바른 길을 가고 있는 걸까요? 여러분에게는 쉬운 문제일 것입니다.

-- BEGIN TRANSACTION (HOW TO DO?)

UPDATE Bookings
 SET TicketsBooked = TicketsBooked + @TicketsToBook
 WHERE FlightId = @Id AND TicketsMax < (TicketsBooked + @TicketsToBook)

-- Here I need to insert only if the row doesn't exists.
-- If the row exists but the condition TicketsMax is violated, I must not insert 
-- the row and return FALSE

IF @@ROWCOUNT = 0 
BEGIN

 INSERT INTO Bookings ... (omitted)

END

-- END TRANSACTION (HOW TO DO?)

-- Return TRUE (How to do?)
질문에 대한 의견 (2)

병합해야 함장님이요 보세요 업데이트 할 수 있는 '', ',' &amp 삽입하십시오 '삭제' 한 것이다.

이것은 apc® 구축상의 사용에 대한 '병합'

  • It 검사를 하기 전에 다른 삽입, 비행 꽉 표시할지를 업데이트하려면 않습니다.

있는 경우 (선택 1) 를 information_schema.tables t

39, & # 39 Bookings& creditbank. T. TABLE_NAME =;)

시작한다. 드롭합니다 표 예약 end 검색하기를

기장 (테이블 만들기 아이디 (1, 1) 기본 키, 프리트리드 int 티켓스마스 int not null, 티케츠부케드 int not null ) 검색하기를

1, 0 을 삽입하십시오 기장 (티켓스마스, 티케츠부케드) 선택 2, 2 삽입하십시오 기장 (티켓스마스, 티케츠부케드) 기장 (티켓스마스, 티케츠부케드) 삽입하십시오 선택 3, 1 검색하기를

일부 * 에서 공연

그리고는.

declare @FlightID int = 1
declare @TicketsToBook int = 2

--; This should add a new record
merge Bookings as T
using (select @FlightID as FlightID, @TicketsToBook as TicketsToBook) as S
    on  T.FlightID = S.FlightID
      and T.TicketsMax > (T.TicketsBooked + S.TicketsToBook)
  when matched then
    update set T.TicketsBooked = T.TicketsBooked + S.TicketsToBook
  when not matched then
    insert (TicketsMax, TicketsBooked) 
    values(S.TicketsToBook, S.TicketsToBook);

select * from Bookings
해설 (3)

각 항공편에 한 줄로만 탑승할 수 있나요? 그렇다면요:

IF EXISTS (SELECT * FROM Bookings WHERE FLightID = @Id)
BEGIN
    --UPDATE HERE
END
ELSE
BEGIN
   -- INSERT HERE
END

최대 10개의 항공권이 있는데 20개를 예약하는 경우 새 행이 삽입되므로 이러한 방식은 항공편을 초과 예약할 수 있다고 말씀드린 것으로 가정합니다.

해설 (7)

업다록 놋좆 홀드록 존재를 위한 테스트를 통과할 때, 힌트, 행.

/ 기본 읽기 시작 전,, pre&gt &lt &lt code&gt 커밋됨 격리 레벨을 정상입니다 /

그렇지 않으면 존재 (select from Table) 와 (업다록 놋좆 홀드록,) 라고 하자.) / 삽입하십시오 / 다른 / 업데이트하십시오 */

/ 잠급니다 커밋합니다 릴리즈됨 / 여기 있다. &lt /code&gt &lt /pre>;;;

업다록 잠글 수 있는 힌트를 쿼리하지 강제로 불러키지 업데이트하십시오 이미 존재하는 경우, 또는 다른 트랜잭션입니다 때까지 수정하지 못하도록 막는 행일 커밋합니다 롤백합니다.

홀드록 쿼리가 여러 다른 것을 방지할 수 있는 힌트를 docname 잠급니다 추가에는 기준에 맞는 행일 시행하십시오 금융거래 필터링합니다 때까지 또는 커밋합니다 롤백합니다.

이 놋좆 힌트 docname 행 수준 잠금 대신 기본값입니다 페이지 수준, 그래서 당신의 트랜잭션까지 세분성을 won& # 39, t 블록이어야 트랜잭션입니다 업데이트하려면 같은 페이지에 연관해제된 행뿐만 다른 것 (하지만 고려하십시오 사이의 상관 관계를 더 충돌과 증가 잠금식 오버헤드에 - 잠급니다 피해야 합니다 많은 수의 행 수준 등을 하나의 트랜잭션).

지켜보리니 http://msdn.microsoft.com/en-us/library/ms187373.aspx 자세한 내용을 확인할 수 있습니다.

참고로 전 doesn& 시작할 때 어떤 시행하십시오 잠급니다 수행됨을 제표를 있다 - 그들 실행됨을 호출, t # 39 에 대한 내성 제공하십시오 트랜잭션까지 잠급니다 시작하기 전에 뭔가 다른 곤란 합니다. 최대한 빠른 시간을 가질 수 있도록 기업의 SQL 및 팩터에서의 시도해야 합니다 잠급니다 커밋하면 대한 트랜잭션 해야한단말입니다 (올해 초 출시 인수합병 (m&a).

단, PK 는 bigint 같은 경우 행 수준 잠급니다 유효인 떨어질 수 있습니다, SQL Server 는 내부 해시 값 (다른 키 값을 해시라고 잠급니다 5월 동일한 id) 의 64 비트 계속된다.

해설 (4)

39 m 먹어서나 내 솔루션이므로 i&. # 39, & # 39, 내 방식을 doesn& t stand if& # 39. # 39, & # 39, 또는 merge&. 내 방식을 쉽지 않다.

INSERT INTO TableName (col1,col2)
SELECT @par1, @par2
   WHERE NOT EXISTS (SELECT col1,col2 FROM TableName
                     WHERE col1=@par1 AND col2=@par2)

예를 들면 다음과 같습니다.

INSERT INTO Members (username)
SELECT 'Cem'
   WHERE NOT EXISTS (SELECT username FROM Members
                     WHERE username='Cem')
  • Explanation:*

(1) 에서 col1 선택, col2 및 col2 @par2 @par1 타바레나미 creditbank. col1 = = 정보기술 (it) 의 값을 타바레나미 선택함 검색

(2), 존재하지 않는 @par2 @par1 선택합니다. (1) 에서 서브케리 존재하지 않을 경우 걸립니다.

(3) 에 값을 삽입물의 타바레나미 단계 (2)

해설 (2)

난 결국 삽입하려면 조건으로 행일 있었습니다, 이미 it didn& t # 39 를 사용하여 다음과 같은 모델:

INSERT INTO table ( column1, column2, column3 )
(
    SELECT $column1, $column2, $column3
      WHERE NOT EXISTS (
        SELECT 1
          FROM table 
          WHERE column1 = $column1
          AND column2 = $column2
          AND column3 = $column3 
    )
)

어떤 난 http://moss. dell.:

http://www.postgresql.org/message-id/87hdow4ld1.fsf@stark.xeocode.com

해설 (1)

이것은 제가 최근에 해야만 했던 일입니다:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[cjso_UpdateCustomerLogin]
    (
      @CustomerID AS INT,
      @UserName AS VARCHAR(25),
      @Password AS BINARY(16)
    )
AS 
    BEGIN
        IF ISNULL((SELECT CustomerID FROM tblOnline_CustomerAccount WHERE CustomerID = @CustomerID), 0) = 0
        BEGIN
            INSERT INTO [tblOnline_CustomerAccount] (
                [CustomerID],
                [UserName],
                [Password],
                [LastLogin]
            ) VALUES ( 
                /* CustomerID - int */ @CustomerID,
                /* UserName - varchar(25) */ @UserName,
                /* Password - binary(16) */ @Password,
                /* LastLogin - datetime */ NULL ) 
        END
        ELSE
        BEGIN
            UPDATE  [tblOnline_CustomerAccount]
            SET     UserName = @UserName,
                    Password = @Password
            WHERE   CustomerID = @CustomerID    
        END

    END
해설 (1)

병합]1 기능을 사용하여 달성할 수 있습니다. 그렇지 않으면 할 수 있습니다:

declare @rowCount int

select @rowCount=@@RowCount

if @rowCount=0
begin
--insert....
해설 (2)

다음은 전체 솔루션 (커서 구조 등). 덕분에 많은 포르쿠스 카시우스 의 '트랜스 시작합니다. '코드 (커밋합니다 위에 올렸다.

declare @mystat6 bigint
declare @mystat6p varchar(50)
declare @mystat6b bigint

DECLARE mycur1 CURSOR for

 select result1,picture,bittot from  all_Tempnogos2results11

 OPEN mycur1

 FETCH NEXT FROM mycur1 INTO @mystat6, @mystat6p , @mystat6b

 WHILE @@Fetch_Status = 0
 BEGIN

 begin tran /* default read committed isolation level is fine */

 if not exists (select * from all_Tempnogos2results11_uniq with (updlock, rowlock, holdlock)
                     where all_Tempnogos2results11_uniq.result1 = @mystat6 
                        and all_Tempnogos2results11_uniq.bittot = @mystat6b )
     insert all_Tempnogos2results11_uniq values (@mystat6 , @mystat6p , @mystat6b)

 --else
 --  /* update */

 commit /* locks are released here */

 FETCH NEXT FROM mycur1 INTO @mystat6 , @mystat6p , @mystat6b

 END

 CLOSE mycur1

 DEALLOCATE mycur1
 go
해설 (0)
INSERT INTO [DatabaseName1].dbo.[TableName1] SELECT * FROM [DatabaseName2].dbo.[TableName2]
 WHERE [YourPK] not in (select [YourPK] from [DatabaseName1].dbo.[TableName1])
해설 (0)

이 문제가 처음 만들 수 있는 가장 효과적인 방법을 데이터베이스 열에 고유해야

'표' 변경하십시오 table_name 고유 키 추가

'다음' t be 삽입됨 won& # 39 에 무시하시겠습니까 삽입하십시오 table_name 값은 키 / 이미 존재하는 경우, 그 결과 복제본임을 한 표.

해설 (1)
INSERT INTO table ( column1, column2, column3 )
SELECT $column1, $column2, $column3
EXCEPT SELECT column1, column2, column3
FROM table
해설 (2)