PATINDEX (oder auch LIKE) mit Platzhaltern in gespeicherter Prozedur verwenden
Es geht wieder einmal mehr um die Syntax bei MS-Access und SQL ...
Ein MS-Access Projekt, verbunden mit einem MS SQL-2000 SERVER, verwendet eine gespeicherte Prozedur, welche beim Aufruf z.B. einen Wert für eine Variable übergeben bekommt. Dieser wird in dieser Prozedur bei einer Select-Anweisung auf Vorhandensein in einer Tabellenspalte geprüft und die entsprechenden Zeilen der Tabelle ausgegeben. In einem zweiten Fall soll diese Prüfung entfallen und alle Zeilen der Tabelle sollen ausgegeben werden (neben anderen Kriterien).
Um die SELECT-Anweisung mit verschiedenen Variablen ausführen zu können, wird diese in eine Zeichenkette geschrieben und dann mit EXEC(Zeichenkette) ausgeführt. Soweit so gut. Z.B.
An Stelle von LIKE habe ich auch ---> PATINDEX('% .. ' + @param + ' ... %', Spalte) > 0 <--- in HAVING mit mehreren Syntaxvarianten versucht.
Aber:
@param mit '?' oder '*' bringt Fehler, PATINDEX ebenso bei Übergabe von '%' oder '%%' , Alle möglichen Kombinationen von
PATINDEX ''%' + ' + @param + ' + '%'' erkennen % als Modulo Datentyp oder bringen in anderen Varianten Syntaxfehler.
Wenn ich dann endlich eine Variante habe, bei welcher "händig" die Ausführung der Prozedur funktioniert, kann ich dies aus VBA nicht ausführen, weil die Stringübergabe Fehler bringt.
What can I do ?
(Um Mißverständnissen vorzubeugen: Um alle Zeilen der Tabelle auszuwählen, kann natürlich auch @param mit einem Standardwert belegt werden, welcher dann bei LIKE mit einer OR - Ergänzung abgefragt wird, wenn keine Wertauswahl erfolgen soll. Es geht mir vielmehr prinzipiell darum, wie z.B. das
Beispiel der MS-Server 2000 Hilfe: ....... LIKE @au_lname + '%' ....... so in den @cmdstr eingefügt werden kann, dass % nicht als Modulo interpretiert wird oder Syntaxfehler beim Aufruf der Prozedur aus VBA gemeldet werden, wenn EXEC(@CmdStr) ausgeführt wird.)
PCFJKG
Ein MS-Access Projekt, verbunden mit einem MS SQL-2000 SERVER, verwendet eine gespeicherte Prozedur, welche beim Aufruf z.B. einen Wert für eine Variable übergeben bekommt. Dieser wird in dieser Prozedur bei einer Select-Anweisung auf Vorhandensein in einer Tabellenspalte geprüft und die entsprechenden Zeilen der Tabelle ausgegeben. In einem zweiten Fall soll diese Prüfung entfallen und alle Zeilen der Tabelle sollen ausgegeben werden (neben anderen Kriterien).
Um die SELECT-Anweisung mit verschiedenen Variablen ausführen zu können, wird diese in eine Zeichenkette geschrieben und dann mit EXEC(Zeichenkette) ausgeführt. Soweit so gut. Z.B.
Alter Procedure P_Test
(
@Param varchar(9)
)
As
DECLARE @CmdStr varchar(3000)
SET @CmdStr = 'SELECT DISTINCT TOP 100 PERCENT <TABLE> ...
INTO
FROM
INNER JOIN
WHERE
GROUP BY
HAVING (TABLE.Spalte LIKE ' + @Param + ')
ORDER BY'
EXEC (@Cmdstr)
Aber:
@param mit '?' oder '*' bringt Fehler, PATINDEX ebenso bei Übergabe von '%' oder '%%' , Alle möglichen Kombinationen von
PATINDEX ''%' + ' + @param + ' + '%'' erkennen % als Modulo Datentyp oder bringen in anderen Varianten Syntaxfehler.
Wenn ich dann endlich eine Variante habe, bei welcher "händig" die Ausführung der Prozedur funktioniert, kann ich dies aus VBA nicht ausführen, weil die Stringübergabe Fehler bringt.
Call Application.CurrentProject.Connection.Execute("Exec P_Test '' ")
Call Application.CurrentProject.Connection.Execute("Exec P_Test ' ' ")
Call Application.CurrentProject.Connection.Execute("Exec P_Test '%' ")
Call Application.CurrentProject.Connection.Execute("Exec P_Test '?' ")
Call Application.CurrentProject.Connection.Execute("Exec P_Test '*' ")... usw. bis irgendwann die Geduld zu Ende ist.
(Um Mißverständnissen vorzubeugen: Um alle Zeilen der Tabelle auszuwählen, kann natürlich auch @param mit einem Standardwert belegt werden, welcher dann bei LIKE mit einer OR - Ergänzung abgefragt wird, wenn keine Wertauswahl erfolgen soll. Es geht mir vielmehr prinzipiell darum, wie z.B. das
Beispiel der MS-Server 2000 Hilfe: ....... LIKE @au_lname + '%' ....... so in den @cmdstr eingefügt werden kann, dass % nicht als Modulo interpretiert wird oder Syntaxfehler beim Aufruf der Prozedur aus VBA gemeldet werden, wenn EXEC(@CmdStr) ausgeführt wird.)
PCFJKG
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94580
Url: https://administrator.de/contentid/94580
Ausgedruckt am: 24.11.2024 um 04:11 Uhr
2 Kommentare
Neuester Kommentar
Moin PCFJKG,
das Problem ist eigentlich nur das Verpacken des einfachen Anführungszeichens, das ja Bestandteil des von LIKE verwendeten Parameters sein muss.
Ich würde dieses Detail aber schon aus Wartbarkeitsgründen bei der Erzeugung Deines CMDStr's angehen:
Im erzeugten Call-Aufruf wäre die Mimik entsprechend
Grüße
Biber
das Problem ist eigentlich nur das Verpacken des einfachen Anführungszeichens, das ja Bestandteil des von LIKE verwendeten Parameters sein muss.
Ich würde dieses Detail aber schon aus Wartbarkeitsgründen bei der Erzeugung Deines CMDStr's angehen:
SET @CmdStr = 'SELECT DISTINCT TOP 100 PERCENT <TABLE> ...
INTO
FROM
INNER JOIN
WHERE
GROUP BY
HAVING (TABLE.Spalte LIKE '+char(39) + @Param + char(39)+ ')
ORDER BY'...
Im erzeugten Call-Aufruf wäre die Mimik entsprechend
Call Application.CurrentProject.Connection.Execute("Exec P_Test chr(39)+'bla%' +chr(39) ")
Grüße
Biber