2017-05-13 6 views
2

Ich habe diese gespeicherte Prozedur, die Daten aus 4 Tabellen und rangiert sie um 4 Spalten, aber ich brauche eine Ansicht mit dem gleichen Ergebnis (natürlich ohne Parameter). Ist das möglich? Ich weiß, dass ich keine temporäre Tabelle im Blick haben kann, keine Lösung ?!Wie kann ich eine gespeicherte Prozedur in eine Ansicht transformieren?

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) Verwenden Sie niemals SELECT *, da sich Ihre Tabellen ändern können. 2) Fragen Sie nach der Syntax zum Erstellen einer Ansicht? 3) Dieser Proc ist scheußlich für Starter und Unterabfragen in Ihrer Select-Anweisung, wie dies bei hideos der Fall ist. 4) Erstellen Sie eine Tabelle zum Speichern dieser Informationen, wenn diese häufig verwendet wird und Sie die Leistung sparen. –

Antwort

3

ein Common Table Expression (CTE) statt einer temporären Tabelle, die Verwendung und den CTE verwenden, wo Sie die temporäre Tabelle jetzt verwenden.

Wie so:

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 
    -- ... 

diese Weise können Sie eine einzelne Abfrage erstellen und Paket, das aus Ihrer Sicht.

+0

Das funktioniert !! Danke vielmals. – koda5

Verwandte Themen