GP, Tabelle als Variable zurückgeben
Aus einer Tabelle sollen Zeilen mittels einer gespeicherten Prozedur ausgewählt und in einer Tabellenvariablen von dieser Prozedur zurückgegeben werden.
MS-Access-2000 Projekt, verbunden mit MS-SQL 2000 SERVER. In einem Formular des Access-Projektes sollen die Ergebnisse einer Abfrage in einem Listenfeld zur Verfügung stehen. Um ein hohes Tempo zu erzielen, wird diese Abfrage in einer gespeicherten Prozedur ausgeführt, dort werden auch die Selectionsparameter aus bestimmten anderen Tabellen ermittelt.. Zunächst hatte ich das Ergebnis der Abfrage in einer globalen temporären Tabelle ##Table gespeichert. Dabei nicht bedacht, daß diese bei allen angemeldeten Benutzern (meist 4 User gleichzeitig) im Netz sichtbar ist und somit ungewollt z.B. das Ergebnis der Abfrage des Users A in der Tabelle ##Table des Users B gespeichert wird und dort die Source des Listenfeldes ist. Versuche, mit lokalen Tabellen #Table zu arbeiten (das würde wohl das Problam auch lösen) sind daran gescheitert, daß #Table nicht vom Listenfeld gefunden wird. Nun hoffe ich, eine Variable - die als Tabelle definiert ist - zur Quelle des Listenfeldes zu machen und das diese dann nur vom jeweilig die gespeicherte Prozedur aufrufenden User "gesehen" wird.
Frage, wie definiere ich den Rückgabeparameter .... CreateParameter("TableName", ad (Table??) , adParamOutput ... ?? vor dem --> Execute der Prozedur und wie wird diese Tabelle in der gespeicherten Prozedur so deklariert, daß sie ein Rückgabewert als Tabelle wird ?
Falls jemand weiß, wie man die Aufgabe doch noch mit lokalen Tabellen #Table lösen kann, wäre das natürlich fast noch besser (?).
Vielen Dank im Voraus,
PCFJKG
MS-Access-2000 Projekt, verbunden mit MS-SQL 2000 SERVER. In einem Formular des Access-Projektes sollen die Ergebnisse einer Abfrage in einem Listenfeld zur Verfügung stehen. Um ein hohes Tempo zu erzielen, wird diese Abfrage in einer gespeicherten Prozedur ausgeführt, dort werden auch die Selectionsparameter aus bestimmten anderen Tabellen ermittelt.. Zunächst hatte ich das Ergebnis der Abfrage in einer globalen temporären Tabelle ##Table gespeichert. Dabei nicht bedacht, daß diese bei allen angemeldeten Benutzern (meist 4 User gleichzeitig) im Netz sichtbar ist und somit ungewollt z.B. das Ergebnis der Abfrage des Users A in der Tabelle ##Table des Users B gespeichert wird und dort die Source des Listenfeldes ist. Versuche, mit lokalen Tabellen #Table zu arbeiten (das würde wohl das Problam auch lösen) sind daran gescheitert, daß #Table nicht vom Listenfeld gefunden wird. Nun hoffe ich, eine Variable - die als Tabelle definiert ist - zur Quelle des Listenfeldes zu machen und das diese dann nur vom jeweilig die gespeicherte Prozedur aufrufenden User "gesehen" wird.
Frage, wie definiere ich den Rückgabeparameter .... CreateParameter("TableName", ad (Table??) , adParamOutput ... ?? vor dem --> Execute der Prozedur und wie wird diese Tabelle in der gespeicherten Prozedur so deklariert, daß sie ein Rückgabewert als Tabelle wird ?
Falls jemand weiß, wie man die Aufgabe doch noch mit lokalen Tabellen #Table lösen kann, wäre das natürlich fast noch besser (?).
Vielen Dank im Voraus,
PCFJKG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 101000
Url: https://administrator.de/contentid/101000
Ausgedruckt am: 24.11.2024 um 04:11 Uhr
4 Kommentare
Neuester Kommentar
Moin PCFJKG,
--> #Tables haben nicht immer einen Namen, eher eine Namens-Pattern, einen Namensrumpf. Den exakten außerhalb der SP weisst Du nicht, Innerhalb der SP wird IMMER der richtig interpretiert, den Du angibst.
--> ##Tables gehen erst recht nicht ->hast Du ja selbst erläutert.
Bleiben CURSOR oder @variablen vom typ table.
Ich würde (wenn der Resultset nicht zu gross ist) über eine table-Variable gehen.
Also sinngemäß
In der SP selbst kanst Du dann nochmal ein
Da die @jezzinruhe angelegte und befüllte lokale Variable ebenso vom Datentyp "table" ist wie auch@DeinOutput kannst Du gegen Ende der SP ein "SET @deinoutput = @jezzinruhe" abfeuern und bekommst den Resultset zurück.
Das war schon alles.
Grüße
Biber
...daran gescheitert, daß #Table nicht vom Listenfeld gefunden wird.
Okay, das kann aber daran liegen, dass besagte 4 Benutzer denselben Namen "#Table" benutzen und MSSQL schlau wie Sau natürlich immer bei Bedarf eine Ziffer an den Tabellennamen "#Table" hängt. Blöd nur, wenn jemand auf genau diese Tabelle außerhalb der Stored Procedure zugreifen können soll.--> #Tables haben nicht immer einen Namen, eher eine Namens-Pattern, einen Namensrumpf. Den exakten außerhalb der SP weisst Du nicht, Innerhalb der SP wird IMMER der richtig interpretiert, den Du angibst.
--> ##Tables gehen erst recht nicht ->hast Du ja selbst erläutert.
Bleiben CURSOR oder @variablen vom typ table.
Ich würde (wenn der Resultset nicht zu gross ist) über eine table-Variable gehen.
Also sinngemäß
CREATE PROCEDURE dbo.WTFduTust (
@EinInPara NVARCHAR(50))
, @NochnInpara int
, @deinOutput table OUTPUT
AS
......
DECLARE @jezzinruhe as (Column1, .....ColumnN) Primary key ...
machen und Deinen Resultset dort zwischenparken - Die Column-Angaben mit der gleichen syntax wi bei einem CREATE TABLE.Da die @jezzinruhe angelegte und befüllte lokale Variable ebenso vom Datentyp "table" ist wie auch@DeinOutput kannst Du gegen Ende der SP ein "SET @deinoutput = @jezzinruhe" abfeuern und bekommst den Resultset zurück.
Das war schon alles.
Grüße
Biber
Moin PCFJKG,
hmm, das ist für mich jetzt nicht erkennbar, welches der beiden TABLE-Schlüsselworte angemosert wird.
Am wahrscheinlichsten erscheint es mit, wenn bei der Deklaration der OUTPUT-Variablen auch noch die Feldbeschreibung erwartet werden würde.
Aber abgesehen davon - vielleicht denke ich hier auch zu sehr um die Ecke.
Eventuell wäre es ja doch einfacher, doch noch mal den Gedanken mit EINER ##Table aufzuwärmen.
Angenommen, es gäbe in der Tat nur eine ##Table namens ##FuerAlle mit den ermittelten Listbox-Werten, die sich je User aber unterscheiden.
Könnten die nicht auseinandergehalten werden durch eine zusätzliche Spalte "Userid" in dieser tabelle und einer entsprechenden WHERE-Clause beim Auslesen.
Würde eine Menge Gewürge ersparen...
Grüße
Biber
hmm, das ist für mich jetzt nicht erkennbar, welches der beiden TABLE-Schlüsselworte angemosert wird.
Am wahrscheinlichsten erscheint es mit, wenn bei der Deklaration der OUTPUT-Variablen auch noch die Feldbeschreibung erwartet werden würde.
Aber abgesehen davon - vielleicht denke ich hier auch zu sehr um die Ecke.
Eventuell wäre es ja doch einfacher, doch noch mal den Gedanken mit EINER ##Table aufzuwärmen.
Angenommen, es gäbe in der Tat nur eine ##Table namens ##FuerAlle mit den ermittelten Listbox-Werten, die sich je User aber unterscheiden.
Könnten die nicht auseinandergehalten werden durch eine zusätzliche Spalte "Userid" in dieser tabelle und einer entsprechenden WHERE-Clause beim Auslesen.
Würde eine Menge Gewürge ersparen...
Grüße
Biber