2017-09-29 3 views
1

각 레코드의 시작 날짜 값인 첫 번째 날짜로 각 날짜의 값으로 구분해야하는 고유 식별자, 시작 날짜 및 두 개의 세미콜론으로 구분 된 문자열을 가진 레코드가있는 테이블이 있습니다.루핑이 좋지 않으므로 어떻게해야합니까?

현재 테이블 (16K 레코드 +)의 각 레코드를 탐색하는 While 루프를 사용하고 While 루프를 사용하는 분할 함수를 사용하고 있으므로 모든 종류의 나쁜 작업을 수행하고 있습니다. 분할 기능은 Oskar Austegard의 dbo.fnSplit 기능을 기반으로합니다.

필자는 분리를 위해 루프를 사용하는 것이 성능에 좋지 않지만 이러한 구분 된 문자열은 최대 100 개의 항목을 가지고있는 방법에 대해 읽었습니다. 나는 CROSS APPLY에 대해 배우려고 애를 쓰고 있으며, 작성한 여러 SP에 CTE를 사용하고 있습니다. 그러나 CTE를 사용하면 효과가 있을지, 어떻게 작동하는지 확실하지 않습니다. 특히 CROSS APPLY 또는 다른 APPLY에 대해 확신 할 수 없습니다.

누군가가 기꺼이 도움을 청하면 내 쿼리와 혼란 스플릿 기능을 기꺼이 게시 할 것입니다.

+2

특히 현재 코드뿐 아니라 일부 샘플 데이터를 공유 할 수 있습니까? – Phylyp

+2

샘플 데이터로 설명 된 세미콜론으로 구분 된 문자열에서 분리 된 날짜 값을 사용하는 방법에 대해 좀 더 자세히 설명합니다. – Phylyp

+1

이 기사를 확인하십시오. 그것은 SQL에 대해 꽤 잘 이해하고 있어야하지만 아마도 당신의 목적에 맞게 수정할 수 있습니다. 또한 코드를 표시하면 항상 도움이됩니다! http://www.sqlservercentral.com/articles/Tally+Table/72993/ – Jeremy

답변

1

다음은 this question on MSDN forums과 같은 대답입니다.

데이터 모델 (https://en.wikipedia.org/wiki/First_normal_form)에서 첫 번째 정규 양식을 위반 했으므로 나쁜 행동을하게되었습니다. 데이터는 원 자성이 아니므로 구분 된 목록을 포함해서는 안됩니다. 또한 반복되는 데이터는 일반적으로 동일한 행의 열 대신 별도의 행 (일대 다 관계가있는 다른 테이블에 있음)로 저장해야합니다.

모델을 정규화 주체에 더 가깝게 고치는 경우 쿼리가 훨씬 더 예쁘고 훨씬 더 잘 수행됩니다.

0

루핑이 좋지 않습니다.

.

두 개의 세미콜론으로 구분 된 문자열이있는 레코드가있는 테이블이 있습니다. [T] hese 구분 된 문자열에는 최대 100 개의 항목이 있습니다.

당신은 루핑만큼이나 나쁠 수도 있습니다. 구분 된 데이터를 단일 열에 저장합니다. 그렇게하지 마십시오!

대신 데이터베이스에 새 테이블을 추가하십시오. 이 테이블은 원래 테이블의 기본 키와 구분 된 열의 단일 항목에 대한 공백을 사용합니다. 따라서 원본 테이블의 한 행에 구분 된 열에 100 개의 항목이있는 경우 새 테이블에 각 행에 원래 테이블의 기본 키가 있고 다른 열의 요소 중 하나만있는 행이 100 개 있습니다.

이제 간단하게 JOIN이라는 검색어를 사용하여 각 항목을 식별 할 수 있습니다.