Announcement

Collapse
No announcement yet.

spalten einer sp_ an eine View anhängen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • spalten einer sp_ an eine View anhängen

    Ich habe mir eine SP erstellt, die in der Lage ist, alle Vornamen und Namen auszugeben, die für einen bestimmten Kontakt hinterlegt wurden.

    Das Ergebniss sieht wir folgt aus:
    Code:
    ContactGUID				FirstName		LastName
    68e27200-94ff-453d-b27f-5dedddb42def		Peter		Pan
    Als nächstes habe ich eine view erstellt, die die Spalten "Straße", "Ort" und "PLZ"

    Wie kann ich die View jetzt aber um die Spalten "FirstName" und "LastName" erweitern?

    Hinweis: Die SP wird im Laufe der Entwicklung weiter "generallisiert", d.h. über Parameter wird möglich sein, auch andere Infos zu dem Kontakt zu ermittlen, wie Emails, Telefon usw. (Hängt mit unserem DB-Design zusammen und den Anforderungen der Applikation, das wir für die einzelnen Werte keine Spalte in der Kontakte-Tabelle habe)

  • #2
    Hallo,

    mit einer SP geht das nicht.

    Da müsstest Du Dir eine Benutzerdefinierte Tabellenwertfunktionen erstellen und über CROSS APPLY joinen
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Originally posted by O. Helper View Post
      Da müsstest Du Dir eine Benutzerdefinierte Tabellenwertfunktionen erstellen und über CROSS APPLY joinen
      Da ich das noch nie gemahct habe, stelle ich mal ganz blöd die Frage, wie die TWF aussehen muss.

      Hier eine Beschreibung meines Problems. Wäre nett, wenn einer mal drüber schauen könnte und mir bei der Erstellung der TWF und dem anbinden an die View helfen könnte

      Umgebung:
      wir haben auf SQL-2005 Express in einer Datenbank zwei Tabellen. Diese sehen wie folgt aus und folgende Werte:

      Code:
      Kunden
      ID
      1
      2
      3
      Code:
      Namen
      ID    KundenID    NamensTyp    Wert
      1        1           2         Peter
      2        1           2         Klaus
      3        1           3         Schmidt
      4        2           3         Müller
      (Bemerkung: Typ 2 = Vornamen und Typ 3 = Nachnamen)

      Nun brauchen wir eine TWF, die dann folgendes Ergebniss liefern soll

      Code:
      Kundenliste
      ID    Vorname        Nachname
      1     Peter Klaus    Schmidt
      2                    Müller
      OK - zugegeben, das Beispiel ist "blöd". Aber es geht hier um die Technik. Wenn ich hier die Echtdaten gehabt hätte, wäre es komplizierter geworden - glaubt mir

      Wie gesagt, ich habe Erfahrung mit SP und VIEWS. Aber die TWF´s habe ich bis heute nicht verwendet

      Vielen Dank im Vorraus für eure Unterstützung
      Michael

      Comment


      • #4
        Pack den Code Deiner SP in eine FUNCTION...

        Vom Vorlagen-Explorer des SSMS

        [HIGHLIGHT="SQL"]CREATE FUNCTION <schema_name, sysname, dbo>.<function_name, sysname, EmployeeByID>
        (<parameter1_name, sysname, @employeeID> <parameter1_type,,int>
        )
        RETURNS TABLE
        AS RETURN
        (
        <T-SQL_for_function_body,,SELECT * FROM HumanResources.Employee WHERE EmployeeID = @employeeID>
        )[/HIGHLIGHT]

        PS: <Strg><Shift> <m> ruft einen Dialog zum Ausfüllen der Werte auf...

        Comment


        • #5
          Originally posted by ebis View Post
          Pack den Code Deiner SP in eine FUNCTION...
          Das habe ich gemacht. Als Ergebnis bekomme ich folgende Meldung:
          Code:
          In eine Funktion eingeschlossene SELECT-Anweisungen können keine Daten an einen Client zurückgeben
          Hier der Code für die Funktion
          Code:
          SET ANSI_NULLS ON
          GO
          SET QUOTED_IDENTIFIER ON
          GO
          -- =============================================
          -- Author:		<Author,,Name>
          -- Create date: <Create Date,,>
          -- Description:	<Description,,>
          -- =============================================
          CREATE FUNCTION GetNames 
          (
          	-- Add the parameters for the function here
          )
          RETURNS 
          @NamesFirstName TABLE 
          (
          	-- Add the column definitions for the TABLE variable here
          	nachname VARCHAR(128),
          	vorname VARCHAR (128)
          )
          AS
          BEGIN
          	-- Fill the table variable with the rows for your result set
          	SELECT k.ContactGUID, substring(v.vorname, 2, 2147483647) AS vorname,
          n.nachname
          FROM   Contacts k CROSS apply
                 (SELECT ',' + NameValue
                  FROM   ContactsNames n
                  WHERE  n.ContactGUID = k.ContactGUID AND n.NameTypGUID =
          'BC68CFE5-6A90-492b-9F49-8B682CDC3DF8'
                  ORDER BY NameTypGUID FOR xml path('')) v(vorname) CROSS apply
                  (SELECT NameValue
                   FROM   ContactsNames n
                   WHERE  n.ContactGUID = k.ContactGUID AND n.NameTypGUID =
          '25169EDF-23C9-4b71-913C-58CE91EC1B69') n(nachname) 
          	RETURN 
          END
          GO

          Comment


          • #6
            1. lesen, 2. verstehen und dann 3. richtig machen.

            Du hast ganz richtig die Rückgabe-Tabelle RETURNS @NamesFirstName TABLE .. deklariert, nun solltest Du die auch füllen, um das Ergebnis zurück zu liefert, statt nur ein einfaches SELECT auszuführen, wie man es bei einer SP macht, also etwas wie
            [highlight=SQL]
            INSERT INTO @NamesFirstName
            SELECT k.ContactGUID, substring(v.vorname, 2, 2147483647) AS vorname,
            n.nachname
            FROM Contacts k .... -- usw
            [/highlight]
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              Code:
              CREATE FUNCTION GetNames 
              (
              	-- Add the parameters for the function here
              )
              RETURNS 
              @NamesFirstName TABLE
              Wozu gibts Du der zurückzugebenden Tabelle einen Namen?

              [HIGHLIGHT="SQL"]BEGIN TRAN;
              GO
              CREATE FUNCTION dbo.Test
              (@ObjectName Sysname
              )
              RETURNS TABLE AS RETURN
              (
              SELECT Object_Id, Name FROM sys.Objects WHERE Name LIKE @ObjectName + NCHAR(37)
              )
              ;
              GO
              SELECT * FROM dbo.Test ('sys')

              ROLLBACK;
              [/HIGHLIGHT]
              Dann reicht das kopieren des Codes...

              Comment

              Working...
              X