2009-10-19 5 views
3

메시지, MessageCategory, MessageStatus 및 MessageLevel의 네 가지 테이블이 있습니다.여러 테이블의 데이터가 포함 된 SQL 삽입

MessageCategory, MessageStatus 및 MessageLevel은 모두 ID (기본 키), 코드 및 설명의 세 필드로 구성됩니다. 메시지는이 세 필드를 참조하며 ID (기본 키) MessageText 및 Order를 비롯한 몇 가지 다른 데이터 필드를 포함합니다. ID 필드는 자동 증가 필드입니다.

이제 모든 기본 테이블에 4 개의 테이블을 추가하는 SQL 스크립트를 작성해야합니다. 문제는,이 스크립트를 실행할 고객에게 보낼 스크립트를 만들어야한다는 것입니다. 전체 업데이트를 수행하기 위해 좀 더 지능적인 코드를 작성할 수는 없습니다. 그리고 세 개의 테이블은 단순한 insert 문일 뿐이지 만, 더 많은 두통을 불러 일으키는 것은 Messages 테이블입니다.

색인을 제거 할 수 없으며 기본 키에 대해 1부터 계산을 시작한다고 가정 할 수 없습니다.

INSERT INTO MessageCategory (Code) Values ('Cat01'); 
INSERT INTO MessageStatus (Code) Values ('Status01'); 
INSERT INTO MessageLevel (Code) Values ('Level01'); 

을 그리고 메시지는 다음과 같이해야합니다 :

그래서, 예를 들어, 그녀는 일부 데이터는 비록,

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
VALUES(
    (SELECT Identity from MessageCategory where Code='Cat01'), 
    (SELECT Identity from MessageStatus where Code='Status01'), 
    (SELECT Identity from MessageLevel where Code='Level01'), 
    'Just some message', 
    1 
); 

작동하지 않습니다. 그럼,이 일을하는 속임수는 무엇입니까? (코드를 너무 읽기 좋게 유지하는 ...)

불행히도 다른 데이터베이스에 액세스 할 수 없습니다. 나는 그것을 테스트 할 수 있지만 작동하는 것 같다 후에는

답변

6
INSERT INTO Messages 
    (Category, Status, Level, MessageText, [Order]) 
SELECT 
    (SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01') AS Category, 
    (SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status, 
    (SELECT TOP 1 [Identity] from MessageLevel where Code='Level01') AS Level, 
    (SELECT 'Just some message') AS MessageText, 
    (SELECT 1)      AS [Order] 

위의 SQL Server에 대한 작동합니다 ... 전송 - 및 -기도 - 그것 - 작품의 문제입니다. IdentityOrder은 예약 된 T-SQL 키워드이므로 열 이름으로 사용하면 안됩니다. 또한 하위 쿼리는 TOP 1 문을 포함하도록이 작업을 위해 둘 이상의 행을 반환하지 않아야합니다.

다음으로 주목해야 할 것은 열 별칭 (AS Category 등)이 반드시 필요한 것은 아니라는 것입니다. 그들의 순서는 중요합니다. 나는 특히 SELECT 목록이 길어질 때 가독성을 위해 그것들을 포함시킬 것이다. 그것은 하나의 스크립트가 있다면

+0

난 항상 내 SQL 스크립트에서 대괄호 [] 주위의 모든 테이블과 필드 이름을 사용하는 경향이있다. 그것은 가능한 갈등을 해결합니다. 더 많은 예약어를 필드 및 테이블 이름으로 사용하는 경향이 있으므로 대괄호를 추가하는 것은 자동 작업입니다. :-) –

+0

샘플 코드에서 그렇게 했어야합니다. 게다가. ;-) – Tomalak

+0

그래, 나는 그 괄호가 약간을 혼동하여 실제로 그들을 제거 할 것을 기대했다. :-) –

4

변수에 ID를 저장 :

declare MessageCategoryID int; 
declare MessageStatusID int; 
declare MessageLevel int; 
INSERT INTO MessageCategory (Code) Values ('Cat01'); 
set @MessageCategoryID=scope_identity(); 
INSERT INTO MessageStatus (Code) Values ('Status01'); 
set @MessageStatudID=scope_identity(); 
INSERT INTO MessageLevel (Code) Values ('Level01'); 
set @MessageLevelID=scope_identity(); 

INSERT INTO Messages(Category, Status, Level, MessageText, Order) 
    VALUES(
     @MessageCAtegoryID, 
     @MessageStatusID, 
     @MessageLevelID, 
     'Just some message', 
     1); 
+0

이것은 하나의 스크립트이지만 메시지 테이블에는 수십 개의 레코드가 있습니다. –

+4

ANd 절대 @@ identity를 사용하지 마십시오. 대신 scope_identity를 사용하십시오. @@ identity는 테이블에 트리거가 추가되면 주요 데이터 무결성 문제를 일으킬 수 있습니다. – HLGEM

+0

scope_identity()를 사용하지 않았지만 앞으로 사용하게 될 것입니다.팁 고마워! – Kendrick

관련 문제