2017-05-13 24 views
2

我有這個存儲過程,它從4個表中抽取數據並將它們排列爲4列,但我需要一個具有相同結果(當然沒有參數)的視圖。這可能嗎?我知道我不能在視圖中使用臨時表,任何解決方案?!如何將存儲過程轉換爲視圖?

ALTER PROC pr_GetChildrenByPersonID 
    @pePersonIDs varchar(8000) 
AS 
    SELECT 
     *, 
     RANK() OVER (PARTITION BY pbsPersonID ORDER BY psbPersonSiblingID ASC) AS CustomRank 
    INTO 
     #TempPersonSibling 
    FROM 
     PersonSibling 
    WHERE 
     pbsSiblingTypeID = 2 
     AND pbsPersonID IN (SELECT item 
          FROM dbo.fn_ParseStrListIdentity(@pePersonIDs, ',')) 

    SELECT 
     pePersonID, 
     ISNULL((SELECT pbsName 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 1), '') AS ChildrenName1, 
     ISNULL((SELECT pbsAge 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 1), '') AS ChildrenAge1, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPlaceOfBirth) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 1), '') AS ChildrenCountryOfBirth1, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPresentStay) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 1), '') AS ChildrenCountryOfResidence1, 
     ISNULL((SELECT pbsName 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 2), '') AS ChildrenName2, 
     ISNULL((SELECT pbsAge 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 2), '') AS ChildrenAge2, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPlaceOfBirth) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 2), '') AS ChildrenCountryOfBirth2, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPresentStay) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 2), '') AS ChildrenCountryOfResidence2, 
     ISNULL((SELECT pbsName 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 3), '') AS ChildrenName3, 
     ISNULL((SELECT pbsAge 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 3), '') AS ChildrenAge3, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPlaceOfBirth) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 3), '') AS ChildrenCountryOfBirth3, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPresentStay) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 3), '') AS ChildrenCountryOfResidence3, 
     ISNULL((SELECT pbsName 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 4), '') AS ChildrenName4, 
     ISNULL((SELECT pbsAge 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 4), '') AS ChildrenAge4, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPlaceOfBirth) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 4), '') AS ChildrenCountryOfBirth4, 
     ISNULL((SELECT dbo.fn_GetCountry(pbsPresentStay) 
       FROM #TempPersonSibling 
       WHERE pbsSiblingTypeID = 2 
        AND pbsPersonID = pepersonID 
        AND CustomRank = 4), '') AS ChildrenCountryOfResidence4 
    FROM 
     Person 
    WHERE 
     pePersonID IN (SELECT item 
         FROM dbo.fn_ParseStrListIdentity(@pePersonIDs, ',')) 
+1

1)從不使用SELECT *,因爲表格可能會更改。 2)你是否要求創建視圖的語法? 3)這個過程對於你的select語句中的初學者和子查詢來說是可怕的,就像這是hideos。 4)創建一個表來存儲這個信息,如果這是經常使用,你會節省性能。 –

回答

3

使用Common Table Expression (CTE)而不是臨時表,並使用現在使用臨時表的CTE。

像這樣:

WITH 
    TempPersonSibling AS (
     -- the select statement that creates the temp table here 
     -- without the INTO clause 
    ) 
SELECT 
    pePersonID, 
    ISNULL((SELECT pbsName FROM TempPersonSibling WHERE pbsSiblingTypeID = 2 AND pbsPersonID = pepersonID AND CustomRank = 1),'') AS ChildrenName1, 
    -- ..., rest of the query is similar 
FROM 
    Person 
WHERE 
    -- ... 

這種方式,你可以創建一個單一的查詢和包裝,在您的視圖。

+0

這有效!非常感謝。 – koda5