2010-04-08 3 views
1

Microsoft SQL Server 2008 및 Visual Studio의 Express 버전 만 있습니다. 나는 SQL 서버 프로젝트를 만들 수 있음을 감안할 때, 따라서 CLR 솔루션은 밖으로 질문입니다, 나는 행 연결된 COL2를 얻을 수MySQL의 group_concat 및 이스케이프 된 문자열의 SQL Server 버전

select col1, stuff((select ' ' + col2 
from StrConcat t1 
where t2.col1 = t1.col1 
for xml path('') 
),1,1,'') 
from StrConcat t2 
group by col1 
order by col1 

을 사용하려고했습니다. col2는 &\ n과 같은 일부 제어 문자가있는 varchar 필드입니다. 위의 SQL과 연결하면 제어 문자를 벗어나는 것처럼 보입니다. &이 & amp; \ n이 & #xOD가됩니다. 이는 원하지 않습니다. col1과 연결된 필드가 다른 테이블을 업데이트하는 데 사용될 경우 연결된 필드를 이스케이프 처리되지 않은 원래 형식으로 가져 오는 가장 좋은 방법은 무엇입니까 아니면 존재하지 않으며 유일한 방법은 외부 코드를 사용하는 것입니까?

테이블 스키마는 다음과 같다 : StrConcat (ID INT 기본 키, COL1 INT, TXT의 VARCHAR (80)) COL1 그것에 인덱스가, TXT는 그룹 내 ID 발주, COL1 그룹화한다.

+2

'for xml' 부분은 xml을 응답에 추가합니다. 즉,이 방법을 사용할 때의 단점 중 하나입니다. 그 문제를 생략하는 것이 쉬운 지 확실하지 않습니다. – Wolph

+0

좋은 지적. 그래서 나는 진짜 문제는, 그 단점없이 똑같은 것을 달성 할 수있는 더 나은 해결책이 무엇인지 생각합니다. – TheObserver

+0

쉼표를 사용하여 시도한 다음 REPLACE 함수를 사용하여 쉼표를 실제로 원하는 마크 업으로 바꿀 수 있습니다. –

답변

1

동작은 물론 by design입니다. 이 방법으로 이스케이프하지 않으면 쿼리에서 잘못된 XML을 출력 할 수 있습니다.

SQL Server 내에서 이스케이프되지 않은 값을 가져와야하는 경우 other concatenation methods (재귀 CTE는 일반적으로 CLR 집합과 FOR XML 이후에 가장 효율적이지만 쓰기가 가장 어렵습니다) 중 하나를 사용해야합니다.

물론 이것이 애플리케이션에 직접 전달되는 경우 .NET에서 XmlReader 클래스를 사용하는 것이 훨씬 쉽습니다.

+0

흥미롭게도, 재귀 적 CTE를 시도해 보았습니다. 재귀 적 CTE는 48 분이 걸리며 계산됩니다. 따라서 SQL Server 내에서 코드를 사용하지 않는 한 쉬운 방법이없는 것처럼 들립니다. – TheObserver

+1

@TheObserver : Yikes. 얼마나 많은 행을 연결하려고합니까? 데이터의 색인이 제대로 설정되어 있습니까? 다른 것보다 빠를 수있는 유일한 방법은'UPDATE '트릭이지만, 만약 당신이 그것을 원한다면 임시 테이블/테이블 변수를 먼저 선택해야 할 것입니다. – Aaronaught

+0

160 만 레코드, col1 값에 연결할 가변 행 수. col1에 인덱스가 있습니다. 연결될 필드는 테이블의 기본 키로 정렬해야합니다. 업데이트 트릭이란 무엇입니까? – TheObserver

관련 문제