Benutzer mit den meisten Antworten
SP in SELECT

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
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- Als Antwort markiert Winfried.Sonntag Mittwoch, 12. Februar 2014 17:30
-
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 TableOlaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert Winfried.Sonntag Mittwoch, 12. Februar 2014 17:30
-
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]- Als Antwort markiert Winfried.Sonntag Donnerstag, 13. Februar 2014 11:41
Alle 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- Als Antwort markiert Winfried.Sonntag Mittwoch, 12. Februar 2014 17:30
-
Eine Skalarfunktion mag technisch eleganter erscheinen.
Man muss sich nur bewusst sein, das bei steigenden Datenmengen, durch die dadurch eingeführte "Cursor-Logik" in den Query-Plan, dort mit linearer Performance-Verschlechterung zu rechnen ist.
Daher ist die "nicht so schön aussehende" Verschachtelung von eingebauten Funktionen häufig dennoch die bessere Wahl.
just my 2 cents
Andreas Wolter (Blog | Twitter)
MCM - Microsoft Certified Master SQL Server 2008
MCSM - Microsoft Certified Solutions Master Data Platform, SQL Server 2012
www.andreas-wolter.com | www.SarpedonQualityLab.com -
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 TableOlaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort markiert Winfried.Sonntag Mittwoch, 12. Februar 2014 17:30
-
Hallo Winfried,
der Aufruf ist hier beschrieben:
http://www.toadworld.com/platforms/sql-server/b/weblog/archive/2012/05/09/how-to-call-or-execute-a-stored-procedure-from-inside-a-select-statement.aspxHTH
-
Am 12.02.2014 schrieb Stefan Falz [MVP]:
da würde ich eher eine Funktion erstellen als eine SP.
Danke, das hat geholfen. ;)
Servus
Winfried
Gruppenrichtlinien
WSUS Package Publisher
HowTos zum WSUS Package Publisher
NNTP-Bridge für MS-Foren -
Am 12.02.2014 schrieb Andreas.Wolter:
Man muss sich nur bewusst sein, das bei steigenden Datenmengen, durch die dadurch eingeführte "Cursor-Logik" in den Query-Plan, dort mit linearer Performance-Verschlechterung zu rechnen ist.
Daher ist die "nicht so schön aussehende" Verschachtelung von eingebauten Funktionen häufig dennoch die bessere Wahl.Danke für den Hinweis, bei der niedrigen Anzahl von Datensätzen die es
betrifft, ist die Performance noch nicht betroffen. ;)
Servus
Winfried
Gruppenrichtlinien
WSUS Package Publisher
HowTos zum WSUS Package Publisher
NNTP-Bridge für MS-Foren -
Am 12.02.2014 schrieb Olaf Helper [MVP]:
Sollen es mehrere Werte sein, kannst Du ein TVF = Table Value Function verwenden.
Weitere Beispiele kannst Du z.B. im TechNet Script Center <http://gallery.technet.microsoft.com/scriptcenter> finden:
UDF vergleichbar zu Deinen Anforderungen mit Separator-getrennten Werten: Translate Date Part Name <http://gallery.technet.microsoft.com/scriptcenter/Translate-Date-Part-Name-f0643c4e>
TVF, dito: Convert Small CSV Value to TableIch korrigiere den zweiten Link mal. ;)
http://gallery.technet.microsoft.com/scriptcenter/Convert-Small-CSV-Value-to-ffc142ffAuch dir vielen Dank, die Funktionen schau ich mir an um sie in
Zukunft nutzen zu können. ;)
Servus
Winfried
Gruppenrichtlinien
WSUS Package Publisher
HowTos zum WSUS Package Publisher
NNTP-Bridge für MS-Foren -
Hallo zusammen,
die Function funktioniert einwandfrei. ;) Als 'normaler' Benutzer kam allerdings beim Frontend ein Zugriff verweigert an. So sieht die Funktion aus:
set @Output = LTRIM(SUBSTRING(@strString, CHARINDEX('|', @strString, CHARINDEX('|', @strString, CHARINDEX('|', @strString) + 1) + 1) + 1 , CHARINDEX('|', @strString,CHARINDEX('|', @strString,CHARINDEX('|', @strString, CHARINDEX('|', @strString) + 1) + 1) + 1) - CHARINDEX('|', @strString,CHARINDEX('|', @strString,CHARINDEX('|', @strString) + 1 ) + 1)-1)) + ', '
Die Benutzergruppe hab ich dann explizit in den Eigenschaften der Funktion die Berechtigung zum Ausführen erteilt, erst dann hat es geklappt. Muß ich wirklich jede Funktion zusätzlich und explizit für die Benutzer freigegben?
EDIT: Die Benutzergruppe ist in der Rolle Datareader, Datawriter und Public eingetragen. Reicht das nicht aus oder stimmt da etwas anderes nicht?
Vielen Dank schon im Voraus.
Servus
Winfried
Gruppenrichtlinien
WSUS Package Publisher
HowTos zum WSUS Package Publisher
NNTP-Bridge für MS-Foren- Bearbeitet Winfried.Sonntag Donnerstag, 13. Februar 2014 10:40 ...
-
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]- Als Antwort markiert Winfried.Sonntag Donnerstag, 13. Februar 2014 11:41
-
Am besten eine eigen Datenbankrolle anlegen, für die die benötigten Rechte definieren und dann nur die User dieser Rolle hinzufügen.
Hallo Olaf,
vielen Dank für den Hinweis, ist erledigt. ;)
Servus
Winfried
Gruppenrichtlinien
WSUS Package Publisher
HowTos zum WSUS Package Publisher
NNTP-Bridge für MS-Foren