2011-06-14 2 views
-1

필자는 결국 테이블을 제공하는 SQL 문 집합을 작성했습니다. 전체 문장 세트를 "보기"로 만들고 싶습니다. 어떻게해야합니까? 문 아래에 배치되어SQL Server 2005를 사용하여 SQL 문의 집합을 기반으로보기를 만드는 방법은 무엇입니까?

------------ Creating TempTable(#MasterTable) ---------------------- 
CREATE TABLE #MasterTable 
    (ItemID INT, ItemName VARCHAR(100), Specifications VARCHAR(100), D1 VARCHAR(50), D2 VARCHAR(50), D3 VARCHAR(50), 
      D1_Code VARCHAR(50), D2_Code VARCHAR(50), D3_Code VARCHAR(50)) 

------------ Creating TempTable(#TempItems) ---------------------- 

CREATE TABLE #TempItems(ItemID INT, ItemName VARCHAR(100), Specifications VARCHAR(100), D1 VARCHAR(50), D2 VARCHAR(50), D3 VARCHAR(50), 
        D1_Code VARCHAR(50), D2_Code VARCHAR(50), D3_Code VARCHAR(50)) 
------------ Creating & Inserting TempTable(@Dim) ---------------------- 

DECLARE @Dim TABLE (DCodes VARCHAR(100)) 
INSERT INTO @Dim SELECT D1_Code FROM MAS_SizeType WHERE D1_Code <> '' 
INSERT INTO @Dim SELECT D2_Code FROM MAS_SizeType WHERE D2_Code <> '' 
INSERT INTO @Dim SELECT D3_Code FROM MAS_SizeType WHERE D3_Code <> '' 

------------ Inserting data into TempTable(#MasterTable) ---------------------- 

INSERT INTO #MasterTable 
SELECT  STR_Item.ItemID, STR_Item.ItemName, STR_Item_Specifications.SpecificationName, 
      STR_Item.D1, STR_Item.D2, STR_Item.D3, MAS_SizeType.D1_Code, MAS_SizeType.D2_Code, 
         MAS_SizeType.D3_Code 
FROM   STR_Item INNER JOIN 
         MAS_SizeType ON STR_Item.SizeTypeID = MAS_SizeType.SizeTypeID INNER JOIN 
         STR_Item_Specifications ON STR_Item.SpecificationID = STR_Item_Specifications.SpecificationID 

-------------------- Inserting Data into #TempItems Table ---------------------------- 
INSERT INTO #TempItems 
    SELECT 
      * 
    FROM #MasterTable 

------------------Cursor for All dimensions details into single row for each items ---------------------- 

DECLARE @DCode VARCHAR(MAX), @Cnt INT 
SET @Cnt = 0 

DECLARE ColAdd CURSOR FOR 
    SELECT DISTINCT DCodes FROM @Dim 
OPEN ColAdd 
FETCH NEXT FROM ColAdd INTO @DCode 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SET @Cnt = 1 
     EXECUTE ('ALTER TABLE #TempItems ADD ' + @DCode + ' VARCHAR(50)') 
     EXECUTE('UPDATE #TempItems SET [' + @DCode + '] = M.D1 
        FROM #MasterTable M 
       INNER JOIN #TempItems T ON T.ItemID = M.ItemID AND M.D1_Code = ''' + @DCode + '''') 
     EXECUTE('UPDATE #TempItems SET [' + @DCode + '] = M.D2 
        FROM #MasterTable M 
       INNER JOIN #TempItems T ON T.ItemID = M.ItemID AND M.D2_Code = ''' + @DCode + '''') 
     EXECUTE('UPDATE #TempItems SET [' + @DCode + '] = M.D3 
        FROM #MasterTable M 
       INNER JOIN #TempItems T ON T.ItemID = M.ItemID AND M.D3_Code = ''' + @DCode + '''') 


     FETCH NEXT FROM ColAdd INTO @DCode 
END 
CLOSE ColAdd 
DEALLOCATE ColAdd 
IF (@Cnt = 1) 
BEGIN 

    SELECT @DCode = STUFF((SELECT DISTINCT '],[' + ltrim(DCodes) 
          FROM @Dim 
          ORDER BY '],[' + ltrim(DCodes) 
          FOR XML PATH('') 

             ), 1, 2, '') + ']' 

    EXECUTE ('SELECT ItemID, ItemName, Specifications, ' + @DCode + ' FROM #TempItems ORDER BY ItemName') 
END 

DROP TABLE #TempItems 
DROP TABLE #MasterTable 

답변

2

이것은 저장된 절차 :하지 도면. 보기는 하나의 SELECT입니다 (CTE 및 UNION이있는 경우 일 수도 있음)

multi-statement table valued function에서 선택해야하는 것이 좋습니다. 그러나이를 막을 수있는 한계가 있습니다. YMMV. 그리고 그 성능은 그다지 크지 않다.

+0

Ok. 테이블 값 함수를 사용하려고합니다. 고맙습니다. – thevan

+0

테이블 값 함수를 사용하여 동적 테이블 열을 가져올 수 있습니까? – thevan

+0

@thevan : 아무 생각도하지 않고 그것을 시도했습니다. 나는이 복잡한 코드를 위해 저장된 proc를 사용할 것이다 – gbn

관련 문제