Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

MSSQL Parameter übergeben für in()

Frage Entwicklung Datenbanken

Mitglied: joni2000de

joni2000de (Level 1) - Jetzt verbinden

08.01.2012, aktualisiert 13.01.2012, 6739 Aufrufe, 15 Kommentare

Hallo Admins,

gibt es eine Möglichkeit folgenden Parameter als Variable zu übergeben?

declare @iNummer int
set @iNummer = 100,105,120
where nNR in (@iNummer)

was dem hier entsprechen sollte
where NR in (100,105,120)

Es sind immer unterschiedliche viele Nummern weshalb die Variablen einzeln zu definieren nicht möglich ist. Danke für eure Hilfe.

Gruß Joni
Mitglied: nxclass
09.01.2012 um 09:20 Uhr
Hi,
mal versucht das als String zu übergeben ? (bin mir jetzt aber nicht sicher ob das geht) - ansonsten kann man doch immer ein JOIN über eine temp. Tabelle mit den Zahlen machen.
Wo kommen die Zahlen den her ?
Bitte warten ..
Mitglied: joni2000de
09.01.2012 um 20:25 Uhr
Hi,
das mit dem String funktioniert nicht, war mein erster Versuch. Die Zahlen gibt der User ein und werden in einer Variablen hinterlegt. Die Eingabe soll zukünftig über ein Excel-Makro erfolgen. Wenn das über eine Tabelle geht, kommen sich die unterschiedlichen User da nicht in die Quere?

Gruß Joni
Bitte warten ..
Mitglied: nxclass
09.01.2012 um 22:03 Uhr
kommen sich die unterschiedlichen User da nicht in die Quere
dürfte nicht passieren, da eine temp. Tabelle nur innerhalb einer DB Session existiert.

Wenn Du den SQL Befehl in einem Makro aufrufst - könntest du doch eigentlich auch dort die Zahlen Liste erzeugen !?
Bitte warten ..
Mitglied: MadMax
10.01.2012 um 12:56 Uhr
Hallo Joni,

versuch es mal mit dynamischem SQL:
01.
declare @cNummer nvarchar (max), @nsql nvarchar (max) 
02.
set @cNummer = '100,105,120' 
03.
set @nsql = 'select * from xyz where nNR in (' + @cNummer + ')' 
04.
exec sp_executesql @nsql
Ansonsten, wie oben schon geschrieben, mit temporärer Tabelle.

Gruß, Mad Max
Bitte warten ..
Mitglied: joni2000de
11.01.2012 um 00:59 Uhr
Hi,

das mit dem dynamischen SQL hat leider nicht geklappt. Hier nochmal das ganze Problem. Der User startet eine Exceltabelle und wird aufgefordert seine gewünschten Nummern anzugeben. Diese kann ich dann mit Excel in jede gewünscht Form bringen. Dann wir ein SQL-Select aus einem Textfile eingelesen und diese Nummern eingefügt. Dieses Select ruft dann eine Funktion auf an die diese Nummern übergeben werden müssen. In dieser Funktion steht die Bedingung "where NR in (100,105,120)". Mein Problem ist jetzt, wie bringen ich vom Select diese Nummernfolge in die Funktion, dass sie in in(..) erkannt werden. Das Feld NR auf das die Funktion zugreift ist int und hat bisher alle Varianten "abgelehnt".

Wie müsste ich in dem Fall die Temporäre Tabelle erzeugen? Ich habe das probiert (das Select-Script befüllt vorab die tempräre Tabelle), da kriege ich aber die Meldung, dass die Funktion nicht auf die temporäre Tabelle zugreifen kann (sprich die Funktion lässt sich so gar nicht speichern). Im gleichen Select klappt es wunderbar (im Endausbau sollte das dann nur mit einer Variable funktionieren wie oben beschrieben ist jetzt nur zum testen).

01.
declare @nNR0 int 
02.
declare @nNR1 int 
03.
declare @nNR2 int 
04.
 
05.
set @nNR0=410 
06.
set @nNR1=102 
07.
set @nNR2=103 
08.
 
09.
CREATE TABLE #MyTempTable (nNR INT); 
10.
 
11.
INSERT INTO #MyTempTable VALUES (@nNR0); 
12.
INSERT INTO #MyTempTable VALUES (@nNR1); 
13.
INSERT INTO #MyTempTable VALUES (@nNR2); 
14.
 
15.
select * from tTabellet where nNummer in (select nNR from #MyTempTable)

Gruß Joni
Bitte warten ..
Mitglied: nxclass
11.01.2012 um 08:53 Uhr
01.
select * from tTabellet INNER JOIN #MyTempTable ON (tTabellet.nNr = #MyTempTable.nNr)
.. oder so ähnlich - MSSQL ist nicht so meine Ding.
Bitte warten ..
Mitglied: MadMax
11.01.2012 um 14:53 Uhr
Hallo Joni,

dynamisches SQL und temporäre Tabellen stehen in T-SQL-Funktionen nicht zur Verfügung, das ist richtig.

Dann gäbe es zwei Möglichkeiten:
1. Eine Tabelle, die zwar nicht temporär angelegt ist, aber temporär genutzt wird. Damit sich die einzelnen Anwender nicht ins Gehege kommen, legt man dann eine Spalte an, über die sie unterschieden werden können, z.B. den Benutzernamen, Rechnernamen oder sonstwas eindeutiges. Da käme dann je Nr ein Datensatz rein und darauf könnte dann in der Funktion zugegriffen werden.

2. Am Anfang der Funktion wird die Liste mit Hilfe von charindex und substring zerlegt und in eine Tabellenvariable geschrieben. Die gehen auch in Funktionen. Und darauf kann dann zugegriffen werden, wie auf ganz normale Tabellen.

Gruß, Mad Max
Bitte warten ..
Mitglied: joni2000de
12.01.2012 um 00:41 Uhr
Hi Mad Max,

ich habs noch nicht ganz fertig aber es scheint zu funktionieren (Variante 1). Wie könnte für die 2. Variante die Lösung aussehen? In VBA machst du da eine Schleife, geht so etwas in SQL auch? Sonst ist diese Varianten vermutlich nicht brauchbar, da hier auch mal 100 Werte kommen können.

@nxclass Mein Ding ist es auch noch nicht ganz aber vielleicht wird es das ja mal

Gruß Joni
Bitte warten ..
Mitglied: MadMax
12.01.2012 um 13:42 Uhr
Hallo Joni,

wer da Eure Funktion zusammengebastelt hat, sollte eigentlich auch wissen, daß es in T-SQL auch sowas wie Schleifen und andere Sprachkostrukte gibt

Egal, jedenfalls könnte das dann so aussehen:
01.
create function fn_test (@NrListe varchar (max)) returns int as 
02.
begin 
03.
	declare @Nr int, @pos1 int, @pos2 int, @Ende bit 
04.
	declare @NrTab table (Nr int) 
05.
	 
06.
-- Liste zerlegen in einzelne Werte und nach @NrTab schreiben 
07.
	if len (IsNull (@NrListe, '')) > 0 
08.
	begin 
09.
		select @pos2 = 0, @Ende = 0 
10.
		while 1 = 1 
11.
		begin 
12.
			select @pos1 = @pos2 + 1 
13.
			select @pos2 = charindex (',', @NrListe, @pos1) 
14.
			if @pos2 = 0 select @pos2 = len (@NrListe) + 1, @Ende = 1 
15.
			 
16.
			select @Nr = convert (int, substring (@NrListe, @pos1, @pos2 - @pos1)) 
17.
			insert into @NrTab (Nr) values (@Nr) 
18.
			 
19.
			if @Ende = 1 break 
20.
		end 
21.
	end 
22.
 
23.
-- ab hier kann dann auf eine gefuellte Tabelle @NrTab zugeriffen werden 
24.
	select @Nr = count (*) from @NrTab 
25.
	 
26.
	return @Nr 
27.
end 
28.
go 
29.
 
30.
select dbo.fn_test ('100,105,120') 
31.
go
Gruß, Mad Max
Bitte warten ..
Mitglied: joni2000de
13.01.2012 um 01:41 Uhr
Hi Mad Max,

der Bastler bin ich. Ich bin noch recht neu auf dem Gebiet und mache das auch nur so nebenbei. Aber da ich nicht immer mit dem zufrieden bin was ich geliefert kriege, muss ich mir halt selber helfen, und öfters auch mal helfen lassen . Ich bin froh, dass man an den richtigen Stellen auch die Hilfe findet. So vom drüberfliegen ist mir die Funktion klar, zum selber schreiben muss ich da noch etwas genauer hinschauen. Auf jeden Fall danke, das hilft mir sehr weiter.

Gruß Joni
Bitte warten ..
Mitglied: joni2000de
13.01.2012 um 12:51 Uhr
Hi Mad Max,

da bin ich nochmal. Ich kriegs noch nicht ganz hin. Wenn ich die Funktion so anpasse, dass sie mir alle Einträge zurückliefert, dann kriege ich in der Abfrage folgende Fehlermeldung.
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Mit nur einer Nr funktioniert es, das hilft aber leider nichts.

Ich habe versucht die Werte in eine fixe Tabelle zu schreiben, die nach dem Ausführen der Funktion noch besteht, das lässt die Funktion aber nicht zu (zumindest nicht so wie ich will ).

Dass in der Funktion selber die Werte zur Verfügung stehen reicht leider nicht, da die Aufsplittung von mehreren unterschiedlichen Selects genutzt werden sollte.

Hast du mir vielleich nochmal einen Tipp?

Gruß Joni
Bitte warten ..
Mitglied: MadMax
13.01.2012 um 23:27 Uhr
Hallo Joni,

klar hab ich noch einen Tip für Dich: schreib ein paar Infos in die Frage, sonst muß man zuviel raten

Du könntest damit anfangen, was Du gemacht hast (also den Code Deiner Funktion) und was rauskommen soll.

Gruß, Mad Max
Bitte warten ..
Mitglied: joni2000de
14.01.2012 um 00:13 Uhr
Hi Mad Max,

ich versuche das Ganze nochmal darzustellen.

1
Eingabe einer Reihe von Nummern in Excel über ein Makro und Aufruf eines Selects
2
Aufruf unterschiedlicher Tabellenfunktionen über das Select in die teilweise die Nummern übergeben werden müssen. Dies darum, dass die Funktion bereits bei der Datenabfrage nur die reduzierten Daten abfragen kann. Da es sich immer um unterschiedlich viele Nummern handeln kann ist die Klausel where NR in (..).
3
Weiterverarbeitung der Daten im Select

Das Problem ist jetzt, dass die Nummern als String mit Komma getrennt vorliegen und dieser String zwar an die Funktion als varchar über geben werden kann, in der Funktion für den Wert where NR in (..) int-Werte zwischen den Klammern gefordert werden und somit die Werte einzeln vorliegen müssen.

In deiner Funktion ist die Tabelle nur solange verfügbar wie die Funktion selber läuft und das Ergebnis übergibt. Wenn das Ergebnis nur eine NR ist, dann funktioniert die Weiterverarbeitung, wenn aber mehrere Nummern zurückgegeben werden, dann kriege ich obige Fehlermeldung (dazu habe ich lediglich deinen Code für den Returnwert angepasst, dass er nicht zählt sondern die Werte übergibt
01.
return (select  * from @NrTab)
Ich habe dann noch probiert die Werte mit exec(insert ...) in eine fixe Tabelle zu schreiben, das geht aber in der Funktion nicht.

Die andere Möglichkeit ist, dass Excel die Werte direkt in eine Tabelle schreibt, dann sollte es funktionieren. Da ist dann aber die Funktionalität in der Exceltabelle statt in der DB was ich nicht so elegant und performant gefunden habe.

Nochmal danke für die Hilfe.

Gruß Joni
Bitte warten ..
Mitglied: MadMax
15.01.2012 um 00:40 Uhr
Hallo Joni,

Du hattest den Eindruck erweckt, daß Du die Nummern innerhalb einer Funktion benötigst, das Problem löst Du mit obigem Skript. Der return-Befehl von Dir funktioniert aber natürlich nicht. Wenn es doch nicht in einer Funktion benötigt wird, sondern in mehreren selects, dann funktioniert der richtige Weg bei Dir doch schon (Variante 1 von oben).

Gruß, Mad Max
Bitte warten ..
Mitglied: joni2000de
25.03.2012 um 17:31 Uhr
Hi MadMax,
spät aber doch noch das Feedback.
Ich habe das jetzt so gelöst, dass Excel ein fertiges Script erstellt (Makro), dass dann auf dem SQL-Server ausgeführt wird.Dabei werden die IDs der gewünschten Datensätze in eine Temp-Tabelle geschrieben. Das "große" Script liest dann aus der Tabelle die gewünschten IDs aus und bearbeitet diese weiter. Am Ende wird die Temp-Tabelle wieder geleert. Das funktioniert sehr performant, da Excel lediglich die Eingabe in das Script schreiben muss und dieses an die DB weiterleitet.
Danke für deine Hilfe.
Gruß Joni
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Anführungszeichen aus übergebenen Parametern entfernen
gelöst Frage von RaidManBatch & Shell2 Kommentare

Hallo Kenner und Könner, bin gerade dabei eine Batch zu basteln die Textdateien (detail infos) ändern soll dazu wollte ...

C und C++
Parameter mit argv übergeben in C-Programm
gelöst Frage von djevil-adC und C++12 Kommentare

Hallo, ich mochte einen Parameter an eine Variable übergeben: Wenn ich printf(argv 1 ); aufrufe funktioniert es, wenn ich aber ip.ki.wVk ...

VB for Applications
VB-Script in VB-Script starten und Parameter übergeben
gelöst Frage von denkisVB for Applications7 Kommentare

Hallo liebe Scriptgemeinde, ich muss mehrere Rechner für den Übergang in eine neue Domäne vorbereiten. Dafür sind drei wesentliche ...

Batch & Shell
ESC Steuerbefehlsyntax in Batch parameter übergeben trennen
gelöst Frage von dax4funBatch & Shell3 Kommentare

Hi, hab da eine kleine Schwierigkeit nachdem ich es geschaft habe Steuerbefehle für Bon Drucker abzusetzen wenn ich einen ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 6 StundenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 11 StundenWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 11 StundenWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 23 StundenInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
Von rj11 auf rj45
Frage von jensgebkenLAN, WAN, Wireless19 Kommentare

Hallo Gemeinschaft, könnt ihr mir vielleicht bei der anfertigung eines Kabels helfen - habe ein rj 11 stecker und ...

Netzwerkmanagement
Firefox Profieles im Roaming
gelöst Frage von Hendrik2586Netzwerkmanagement17 Kommentare

Hallo liebe Leute. :) Ich hab da ein kleines Problem, welches anscheinend nicht unbekannt ist. Wir nutzen hier in ...

LAN, WAN, Wireless
Häufig Probleme beim Anmelden in WLAN
Frage von mabue88LAN, WAN, Wireless15 Kommentare

Hallo zusammen, in einem Netzwerk gibt es relativ häufig (1-2 mal pro Woche) Probleme mit der WLAN-Verbindung. Zunächst mal ...

Windows Server
Remotesteuerung der Sitzung (Kennung XX) fehlgeschlagen
gelöst Frage von Stefan91Windows Server14 Kommentare

Hallo Zusammen, seit kurzem bekomme ich oben genannte Fehlermeldung, wenn ich versuche eine Remotesitzung über den Taskmanager fernzusteuern (Rechtsklick ...