none
SP in SELECT RRS feed

  • Frage

  • Hallo zusammen,

    ich hab in einem Feld Werte getrennt durch eine Pipe (|) stehen. In
    VBA kann ich mittels SPLIT die Werte innerhalb der Pipe untereinander
    'verschieben' und wieder retour geben.

    Original Eintrag in der Tabelle:
    Wert1 | Wert2 | Wert3 | und so weiter
    Retour:
    Wert3, Wert1, Wert2 und so weiter.

    Auf dem 2012er SQL Express hab ich mir mit SUBSTRING und CHARINDEX die
    Ausgabe 'angepasst', bläht aber den Code optisch enorm auf. Wenn ich
    allerdings so eine 'Anpassung' als SP abspeichere und die über die GUI
    aufrufe bekomme ich das gewünschte zurück. Wie aber kann ich die SP in einem SELECT unterbringen?

    SELECT MeinFeld, EXEC MeineSP(Parameter1, Parameter2) AS Y FROM
    Tabelle

    Die SP gibt immer nur einen Parameter zurück, falls das eine Rolle
    spielt. Ich hab heute schon viel probiert, leider war die Lösung noch
    nicht dabei. Kann mir jemand den Weg aufzeigen?

    Vielen Dank schon im Voraus.


    Servus
    Winfried

    Gruppenrichtlinien
    WSUS Package Publisher
    HowTos zum WSUS Package Publisher
    NNTP-Bridge für MS-Foren

    Dienstag, 11. Februar 2014 21:40

Antworten

  • Hallo Winfried,

    da würde ich eher eine Funktion erstellen als eine SP.

    Ist ähnlich, lässt sich aber wie von dir gewünscht, direkt im SQL Statement verwenden.

    CREATE FUNCTION [dbo].[fct_MachWas]( @Daten nvarchar( 100 ) ) RETURNS nvarchar( MAX )
    AS
    BEGIN
    
        DECLARE @Output nvarchar( MAX )
        SET @Output = ...
        ...
    
        RETURN   @Output
    END
    

    Aufrufen kann man das dann bspw. so:

    SELECT Spalte1,
           Spalte2,
           dbo.fct_MachWas( SpalteX )
    FROM   Tabelle


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 11. Februar 2014 23:27
    Moderator
  • Hallo Winfried,

    eine Stored Procedure ist eine Art abgespeichert SQL Batch, den man mit vordefinierten Parametern aufrufen kann; innerhalb eines DML Statements kann man eine SP nicht aufrufen.

    Wie Stefan schon vorschlug, kannst Du stattdessen besser eine UDF = User Defined Function verwenden. Wenn Du nur einen Rückgabewert brauchst, kannst Du eine skalare Funktion verwenden, ein Beispiel hat Stefan ja mit geposted.

    Sollen es mehrere Werte sein, kannst Du ein TVF = Table Value Function verwenden.

    Weitere Beispiele kannst Du z.B. im TechNet Script Center finden:

    UDF vergleichbar zu Deinen Anforderungen mit Separator-getrennten Werten: Translate Date Part Name
    TVF, dito: Convert Small CSV Value to Table


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 12. Februar 2014 06:44
  • EDIT: Die Benutzergruppe ist in der Rolle Datareader, Datawriter und Public eingetragen. Reicht das nicht aus oder stimmt da etwas anderes nicht?

    Hallo Winfried,

    durch die Rollemitgliedschaft in "db_datareader" darf der User auf alle Tabellen, auch gerade neu erstellte, zugreifen. Für alle anderen Objektarten wie Stored Procedure, UDF etc müssen jeweils explizit die Ausführungsrechte gesetzt werden, dafür gibt es kein allgemeingültiges Recht wie eben für die Tabellen.

    Am besten eine eigen Datenbankrolle anlegen, für die die benötigten Rechte definieren und dann nur die User dieser Rolle hinzufügen.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 13. Februar 2014 11:05

Alle Antworten