2009-08-07 3 views
0

나는이에 대한 내 머리를 때리고 있었고, 난 그냥 뭔가를 분명 실종,하지만 해요 확신 ... 나는 고객의 데이터베이스에 테이블이, 즉 기본적으로 UNPIVOTted SQL 테이블

의 된 데이터 업데이트 :

Item_Set_Key int 
Item_1  bit 
Notes_1  nvarchar(80) 
Item_2  bit 
Notes_2  nvarchar(80) 
Item_3  bit 
Notes_3  nvarchar(80) 
... 

각 레코드에는 99 개의 항목이 있으며 스키마 변경은 옵션이 아닙니다 (다른 외부 고려 사항 포함).

그러나, 아무것도 원격으로 사용자에게 정보를 닮은에 표시하기 위해, 우리는 다음과 같이 (뷰를 통해)를 피벗 해제 할 수 있습니다

SELECT i.Item_Set_Key, i.Item_Number, i.Selected, i.Item, i2.Notes, i2.Note 
FROM (
SELECT Item_Set_Key, SUBSTRING (Item, 6, 2) AS Item_Number, Selected, Item 
    FROM Item_Set 
    UNPIVOT (Selected FOR Item IN 
     (Item_1, Item_2, Item_3, Item_4, Item_5, ...) 
    ) as u 
) AS i 
LEFT JOIN (
SELECT Item_Set_Key, SUBSTRING (Note, 7, 2) AS Item_Number, Notes 
    FROM Item_Set 
    UNPIVOT (Notes FOR Note IN 
     (Notes_1, Notes_2, Notes_3, Notes_4, Notes_5, ...) 
    ) as n 
) AS i2 ON i2.Item_Set_Key = i.Item_Set_Key 
    AND i2.Item_Number = i.Item_Number 

내가 그리드에 그 표준 바인딩을 . 그러나 텍스트를 SET에서 명시 적으로 이름을 지정해야하지만 항목 및 메모 열의 열 이름이 동적이기 때문에 UpdateCommand를 작성하는 방법에 대한 손실이 있습니다. 각 레코드에는 하나의 항목/노트 쌍에 대한 데이터 만 있기 때문에 모든 열을 설정하면 안됩니다.

아이디어가 있으십니까?

답변

1

데이터 바인딩을 사용하여 원래 피벗 테이블의 변경 내용을 다시 데이터베이스에 보낼 수 없습니다. 대신 각 업데이트를 단일 "작업 단위"로 캡처해야합니다. 예 : 항목 ID = 92, 값 = "Tom". 아마도 이전에 아이템 92의 값은 "Joe"였을 것입니다. 작업 단위는 항목 92의 값을 변경하는 것입니다.

사용자가 사용자 인터페이스를 통해 변경하기 때문에 각 UOW를 일괄 처리하고 저장할 준비가 될 때까지 누르고 있습니다. 사용자가 저장을 요청하면 캡처 된 각각의 UOW가 데이터베이스에 대해 "재생"됩니다. "명령"패턴 및/또는 Jeremy Miller의 기사를 검색하십시오.

또 다른 생각은 스키마를 변경할 수는 없지만 실제로는 가능하다는 것입니다. 피벗되지 않은 형식의 실제 테이블을 만드는 것을 고려하십시오. 그런 다음 현재 테이블을 PIVOT 명령을 사용하는보기로 바꾸십시오. 실제로 더 나은 디자인으로 데이터를 저장하지만 기존 애플리케이션의 경우 데이터를 다시 가져올 수 있습니다. 이것은 피벗 된 디자인에있는 동안 업데이트가 필요하지 않으면 작동 할 수 있습니다.

마지막 옵션은 단순히 두 개의 실제 테이블을 유지 한 다음 주기적으로 동기화하기 위해 복잡한 병합 작업을 작성하는 것입니다.

+0

그래, 내가 피하려고했던 것입니다. 나는 (효과적으로) SQL IF 문 (그리고 거대한, 몇 백 열로 다루는 거대한)의 거대한 집합 아니 었 INSERT/UPDATE/DELETE 명령을 쓸 수있는 방법이 있었으면 좋겠다. 스키마 문제는 레거시 시스템이 거대한 컬럼 형식으로 데이터를 적극적으로 업데이트한다는 사실에서 기인합니다. 그렇기 때문에 거대한 테이블 병합은 추악합니다. 이걸로가는 방법은 설정된 기능을 감싸고 변환하는 sprocs 집합이므로 INSERT/UPDATE/DELETE 문에서 호출을 사용할 수 있습니다. – Thought