2009-05-13 2 views
0

SQL Server 2008 동적으로 생성 된 테이블을 반환해야하는 상황이 발생하며 열 또한 동적으로 생성됩니다.SQL Server 2008 함수에서 테이블 열 정의를 동적으로 생성하는 방법

모든 항목이 쿼리에 의해 생성되었으므로 하나의 ID로 시작한 다음 열 이름과 유형을 가져 와서 캐스팅을 수행합니다.

마지막 쿼리는 다음과 같습니다. 한 테이블에서 원하는 테이블을 반환하지만이 비슷한 쿼리를 사용하면 여러 테이블을 반환 할 수 있습니다.

이것은 현재 C#으로 구현되어 있지만 저장 프로 시저 또는 함수에서 수행 할 수 있어야한다고 생각합니다. 그러나이 쿼리를 작성하고 테이블을 반환하는 방법을 여러 가지로 지정할 수는 없습니다.

감사합니다.

SELECT ResultID, ResultName, ResultDescription, 
CAST([233] AS Real) as [ResultColA], 
CAST([234] AS Int) as [ResultColB], 
CAST([236] AS NVarChar) as [ResultColC], 
CAST([237] AS Int) as [ResultColD] 
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
     MAX(Value) FOR AttributeID IN ([233], [234], [236], [237])) as pvt 

업데이트 : 차량 제조사가있는 테이블이 있고 GM에서 만든 자동차의 모든 속성을 원합니다. 나는 자동차에 대한 정보를 찾아보고, GM의 모든 자동차 제조업체를 얻는 데 사용했다. 그런 다음 GM이 만든 모든 자동차 정보를 얻고 싶다. 정보가 동적으로 생성 되었기 때문에 다르다. 그것이 제가이 테이블을 동적으로 생성해야하는 곳입니다. 나는 아마도 웹 서비스에 호출 할 수 있고 동적으로 생성 된 쿼리를 가져온 다음 저장 프로 시저 또는 함수에서 해당 쿼리를 실행할 수 있는지 궁금합니다.

업데이트 2 : 내가이 테이블을 얻은 다음 단계는 차의 실제 가격을 결정하기 위해 차 (이 경우)에 모든 옵션을 추가해야한다는 것입니다. 그래서 그것이 표 형식이어야합니다. 이 시점에서 GM이 만든 자동차를보고 있지만 SeaRay에서 만든 보트에 대해 다른 쿼리를 수행 할 수 있으며 보트의 테이블 열이 자동차와 다른 경우에도 쿼리가 동일하게 작동해야합니다.

+0

나는 동적으로 생성 된 테이블을 반환 할 필요가 있는지 질문합니다. 왜 이것이 필요한지에 대한 배경 지식을 제공 할 수 있습니까? – RedFilter

+0

데이터베이스의 모든 테이블을 나열하는 테이블이 있습니다. 그래서 엔티티 이름으로 시작하는데, 기본 키와 함께 테이블에서 열 이름을 가져 오는 데 사용합니다. 그런 다음이 단계에서 해당 엔티티의 각 열에 모든 값을 가져오고 자하므로 열 이름이 동적으로 생성됩니다. –

답변

0

동적 SQL을 사용하여이 작업을 수행 할 수 있습니다. 당신은 쿼리 및/또는 메타 데이터를 적절하게이 목록을 작성하고 SQL에 삽입해야합니다

DECLARE @template AS varchar(MAX) 

SET @template = ' 
SELECT ResultID, ResultName, ResultDescription 
{@SELECT_COLUMN_LIST} 
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
     MAX(Value) FOR AttributeID IN ({@PIVOT_COLUMN_LIST})) as pvt' 

DECLARE @sql AS varchar(MAX) 

SET @sql = REPLACE(REPLACE(@template, '{@SELECT_COLUMN_LIST}', @SELECT_COLUMN_LIST), '{@PIVOT_COLUMN_LIST}', @PIVOT_COLUMN_LIST) 

EXEC (@sql) 

@SELECT_COLUMN_LIST@PIVOT_COLUMN_LIST, 당신이있어 몇 가지 옵션을 채울 수 있지만,이 같은 어떤을 방지 커서 또는 어색한 문자열 작업이 필요합니다

SELECT @PIVOT_COLUMN_LIST = COALESCE(@PIVOT_COLUMN_LIST, '') + ',' + QUOTENAME(value) 
FROM (SELECT DISTINCT value FROM table) 

은 분명히 @SELECT_COLUMN_LIST에 대한 일부 메타 데이터와 정보를 결합해야합니다.

PIVOT 및 UNPIVOT이 목록을 동적 SQL로 허용하지 않기 때문에 유지 관리가 쉽도록 작업을 수행했습니다. 그 이유는 출력 테이블에서 스키마가 변경되기 때문입니다. 열이 해석되지 않는 클라이언트 측 보고서 스타일 또는 목록 사용의 경우 중요하지 않습니다.

+0

고맙습니다. 이러한 동적 데이터베이스를 사용하는 방법을 이해하는 데 어려움을 겪고 있습니다. :) –

+0

일반적으로 데이터베이스 내에 데이터베이스를 구축하는 것은 좋지 않지만 동적 SQL은 그 위치가 있습니다. 일반적으로 시스템의 아주 작은 부분입니다. –

관련 문제