2009-07-02 4 views
0

우리는 SQL 서버에 양식 데이터를 저장해야하지만, 새로운 작업마다 필드 이름과 길이가 다른 필드가 있습니다. 예Sql Server 2005에서 xml 데이터의 동적 뷰를 만들 수 있습니까?

Job 1: 
    Field 1: first_name - varchar(20) 
    Field 2: last_name - varchar(30) 

Job 2: 
    Field 1: first_name - varchar(15) 
    Field 2: middle_initial - varchar(1) 
    Field 3: last_name - varchar(30) 

처음에는 문제의 양식과 정확히 일치하는이 데이터를 저장하기 위해 별도의 테이블을 설정했습니다. 그러나이 데이터의 동적 인 속성을 조정하기 위해 매번 변경 될 테이블, procs, dts, ssis 패키지가 너무 많아 유지 보수의 악몽이되었습니다.

우리는 xml 필드에 모든 데이터를 저장하여 문제의 대부분을 해결하는 다른 솔루션을 생각해 냈습니다. 이제는 이와 유사하게 존재합니다.

<Record> 
    <first_name>value</first_name> 
    <last_name>value</last_name> 
</Record> 

그럼 우리가

SELECT 
, IsNull(data.value('(/Record/first_name)[1]', 'varchar(20)'),'') as first_name 
, IsNull(data.value('(/Record/last_name)[1]', 'varchar(30)'),'') as last_name 
FROM FormTable 

지금이 우리가 전에했던 것보다 훨씬 더 테이블에서 데이터를 끌어 뷰를 생성 할뿐만 아니라 우리는 여전히 사용자 정의 각을 볼 작성해야한다는 것을 의미 시각. 차라리 필드를 나열하는 테이블 유형을 유지하고 저를 위해 해당 쿼리를 작성합니다.

Field Name | Field Type | Field Length 
first_name | varchar | 20 
last_name | varchar | 30 

저는 동적 뷰를 만들 수 없다고 확신합니다. 작동 할 수있는 옵션 중 하나는 테이블 값 함수입니다. 그러나 내가 여기서 바라보고있는 것이 있습니까? 이 방법으로 데이터를 동적으로 저장할 수있는 더 좋은 옵션이있을 것입니다 (CouchDB와 같은 다른 데이터베이스가 기본적으로 수행한다는 것을 알고 있기 때문에 SQL Server에서 멀리 이동하지 않아도됩니다.)

답변

0

나는 테이블 값 함수 작동하지 않을 것입니다. 동적 SQL이나 임시 테이블을 사용할 수 없으므로 (이 작업을 수행하는 데 거의 반드시 필요합니다).

스토어드 프로 시저가 확실한 선택입니다. 필요한 모든 작업을 수행 할 수 있지만 문제는 물론 스토어드 프로 시저에서 SELECT 할 수 없다는 것입니다.

this page은 이와 같은 작업을 수행하는 데 필요한 다양한 옵션을 설명합니다. 그가 언급 옵션 중 하나는 매우 쉽게 될 것 같아 OPENQUERY를 사용하고 있지만, 성능 문제가있을 수 :

SELECT * FROM OPENQUERY(LOCALSERVER, 'EXEC sp_getformdata') 

어쨌든, 당신은 몇 가지 추가 아이디어를 얻을 링크를 체크 아웃 할 수 있습니다.

+0

"저장 프로 시저에서 SELECT 할 수 없음"이란 무엇을 의미합니까? 왜 SP가 결과 집합을 반환하지 않을까요? –

+0

음, "SELECT first_name, last_name FROM sp_getformdata"를 수행 할 수 없습니다 -이 프로세스의 다음 부분에서는 분할 된 데이터를 가져 와서 여러 가지 방식으로 예제를 작성하기 때문에 우리가해야 할 일이 실제로 필요합니다 "SELECT first_name +", "last_name FRAME sp_getformdata" –

+0

정보를 제공해 주셔서 감사 드리며 이전에 해당 링크를 읽었습니다. 이러한 옵션 중 하나 하나에 어떤 유형의 페널티가있는 것으로 보이며 수십만 건의 레코드로 작업 할 때 성능이 저하 될 수는 없습니다. –

관련 문제