2009-06-10 3 views
1

MSSQL 2005 데이터베이스를 사용하는 프로젝트에서 우리는 작업을 처리하는 모든 데이터를 로깅 테이블에 기록해야합니다. 해당 테이블의 한 필드는 변경되기 전에 행을 포함해야합니다. 우리는 많은 테이블을 가지고 있으므로 주어진 테이블의 한 행에 모든 필드를 모아서 어떻게 든 연결 한 다음 그 정보로 새 로그 항목을 작성하는 저장 프로 시저를 작성하려고했습니다.다른 테이블의 행을 하나의 필드로 연결

FOR XML PATH를 사용하여 이미 시도했지만 효과적 이었지만 클라이언트는 XML 표기법을 좋아하지 않으며 CSV 필드를 원합니다. 여기

내가 XML 경로와 함께 한 작업은 다음과 같습니다

DECLARE @foo varchar(max); 
SET @foo = (SELECT * FROM table WHERE id = 5775 FOR XML PATH('')); 

"테이블", "아이디"및 (현재 : 5775)는 실제 ID의 값을 나중에 저장에 대한 호출을 통해 전달 될 수를 순서.

XML 표기법을 사용하지 않고 SELECT 문에 의해 반환 될 필드를 미리 알지 못한 채로이를 수행 할 수있는 방법이 있습니까?

답변

0

우리는 XML 경로를 사용 했으므로 발견 한대로 잘 작동합니다. SQL의 기능 중 하나는 XML을 올바르게 저장하는 것이므로 CSV는 의미가 없습니다.

시도해 볼 수있는 것은 XML을 CSV 형식 (가짜 형식)으로 읽는 저장된 proc입니다. 나는 할 것이다. 저장하는 것보다 훨씬 많은 데이터를 읽지 않으므로 오버 헤드는 무시할 수 있습니다. 에 대해 어떻게

0

:

Set @Foo = Stuff(
         (Select ',' + MyCol1 + ',' + MyCol2 ... 
          From Table 
          Where Id = 5775 
          For Xml Path('') 
         ), 1, 1, '') 

이것은 CSV 라인을 생성합니다 (내부 SQL을 추정은 하나의 행을 반환). 자,이 질문의 두 번째 부분을 해결합니다. "어떤 필드를 미리 알지 못한다"는 첫 번째 부분에서는 동적 SQL을 사용하지 않고이 작업을 수행 할 수있는 방법이 없습니다. 즉, SQL 문을 즉시 문자열로 작성해야합니다. 만약 당신이 그렇게하려고한다면 당신은 전체 CSV 결과를 즉각적으로 만들 수도 있습니다.

관련 문제