Jump to content

Ausführen einer SQL Anweisung, die in einem Datenbankfeld hinterlegt ist


Go to solution Solved by winmadness,

Recommended Posts

Ich möchte viele SQL Anweisungen ausführen, aktuell sind diese Anweisungen alle in einer Datei mit Endung .sql gespeichert, zukünftig sollen sie in der Datenbank stehen.

Manuell sieht die Anweisung folgendermaßen aus:

 

declare @tSQL nvarchar(max)

set @tSQL = 'select * from openquery([PA_61_PRODUCTION_PAVAR], ''select AdressNr
     , substring(BelegArt,1,3) as BelegArt
     , substring(Firma,1,10) as Firma
     , substring(Hausnummer,1,12) as Hausnummer
     , substring(Name1,1,35) as Name1
     , substring(Name2,1,35) as Name2
     , substring(Name3,1,35) as Name3
     , substring(Ort,1,30) as Ort
     , substring(PLZ,1,10) as PLZ
     , ReferenzNr
     , substring(Staat,1,3) as Staat
     , substring(Strasse,1,30) as Strasse
     , substring(Typ,1,1) as Typ
     , substring(V_BelegKopfAdr_Obj,1,60) as V_BelegKopfAdr_Obj
FROM PUB.V_BelegKopfAdr'')'

exec (@tSQL)

 

diese Anweisung wird fehlerfrei ausgeführt.

 

In der Tabelle in einem Attribut steht alles von 'select bis '')'

 

In der Prozedur habe ich eine Variable deklariert, in der ich den Inhalt aus dem Tabellenfeld zur weiteren Bearbeitung schreibe.

declare @UpdateProzedur nvarchar(max);

 

Das Auslesen und Aufrufen sieht wie folgt aus:

set @UpdateProzedur = (select [Befehl_Update] from [pA_61_Production_Sichten].[dbo].[Auslesetabellen] where Tabelle = @UpdateTabelle);
        
        
        -- ausführen des Scriptes
        
            if @UpdateTabelle = 'V_BelegKopfAdr'
             execute(@UpdateProzedur);
            if @UpdateTabelle = 'V_BelegKopfAdr'
                print(@UpdateProzedur);

 

den Print Befehl habe ich eingebaut um eine Ausgabe zu bekommen, damit ich weiß, was ausgelesen worden ist.

 

Nach dem execute erhalte ich die folgende Meldung:

 

Meldung 102, Ebene 15, Status 1, Zeile 13
Falsche Syntax in der Nähe von "select * from openquery([PA_61_PRODUCTION_PAVAR], 'select AdressNr
     , substring(BelegArt,1,3) as BelegArt
     , substring(Fir".
'select * from openquery([PA_61_PRODUCTION_PAVAR], ''select AdressNr
     , substring(BelegArt,1,3) as BelegArt
     , substring(Firma,1,10) as Firma
     , substring(Hausnummer,1,12) as Hausnummer
     , substring(Name1,1,35) as Name1
     , substring(Name2,1,35) as Name2
     , substring(Name3,1,35) as Name3
     , substring(Ort,1,30) as Ort
     , substring(PLZ,1,10) as PLZ
     , ReferenzNr
     , substring(Staat,1,3) as Staat
     , substring(Strasse,1,30) as Strasse
     , substring(Typ,1,1) as Typ
     , substring(V_BelegKopfAdr_Obj,1,60) as V_BelegKopfAdr_Obj
FROM PUB.V_BelegKopfAdr'')'

 

Ich weiß mir leider nicht mehr zu helfen und finde den Fehler nicht, wo ist der Unterschied, ob ich den SQL Text manuell in einer Variablen speichere, oder ich die Werte aus einem Attribut hole und in einer Variablen speichere zum Ausführen.

Vielleicht kann mir jemand hierbei helfen.

Link to post

Ist richtig, in dieser Form lässt es sich ausführen, wenn ich den Text direkt in eine Variable schreiben. Schreibweise habe ich aus der Hilfe von Microsoft übernommen und funktioniert wie zu Anfang beschrieben.

Link to post
vor 1 Minute schrieb winmadness:

Auf die Schnelle ein Tipp: einfach den select bis auf ein Feld strippen und dann testen. Wenn es läuft nach und nach die anderen Felder hinzufügen.

Danke, werde ich auch noch versuchen müssen. Hierbei handelt es sich schon um eine Kurzversion, eine Merge - Anweisung kann bis zu 8000 Zeichen enthalten.

vor 5 Minuten schrieb winmadness:

Auf die Schnelle ein Tipp: einfach den select bis auf ein Feld strippen und dann testen. Wenn es läuft nach und nach die anderen Felder hinzufügen.

Meine Kurzversion manuell gestartet und lauffähig:

 

image.png.f571cb6853d21a009973a56b64285e26.png

 

Das ganze in einem Datenbankfeld gespeichert von dort in eine Variable und mit execute ausgeführt:

image.png.fb6a83b747ae4636c63689a4fdd63ba7.png

 

Leider wieder eine Fehlermeldung.

Link to post
  • Solution
Posted (edited)

Lasse beim Speichern in die Tabelle mal die Hochkomma um den gesamten Befehl weg und für den Parameter "query" nur einfache Hochkomma, also

select * from openquery([PA_61_PRODUCTION_PAVAR], 'select AdressNr
     , substring(BelegArt,1,3) as BelegArt
     , substring(Firma,1,10) as Firma
     , substring(Hausnummer,1,12) as Hausnummer
     , substring(Name1,1,35) as Name1
     , substring(Name2,1,35) as Name2
     , substring(Name3,1,35) as Name3
     , substring(Ort,1,30) as Ort
     , substring(PLZ,1,10) as PLZ
     , ReferenzNr
     , substring(Staat,1,3) as Staat
     , substring(Strasse,1,30) as Strasse
     , substring(Typ,1,1) as Typ
     , substring(V_BelegKopfAdr_Obj,1,60) as V_BelegKopfAdr_Obj
FROM PUB.V_BelegKopfAdr')

 

Edited by winmadness
  • Like 1
Link to post
vor 1 Minute schrieb winmadness:

Lasse beim Speicher in die Tabelle mal die Hochkomma um den gesamten Befehl weg und für den Paratemter "query" nur einfache Hochkomma, also


select * from openquery([PA_61_PRODUCTION_PAVAR], 'select AdressNr
     , substring(BelegArt,1,3) as BelegArt
     , substring(Firma,1,10) as Firma
     , substring(Hausnummer,1,12) as Hausnummer
     , substring(Name1,1,35) as Name1
     , substring(Name2,1,35) as Name2
     , substring(Name3,1,35) as Name3
     , substring(Ort,1,30) as Ort
     , substring(PLZ,1,10) as PLZ
     , ReferenzNr
     , substring(Staat,1,3) as Staat
     , substring(Strasse,1,30) as Strasse
     , substring(Typ,1,1) as Typ
     , substring(V_BelegKopfAdr_Obj,1,60) as V_BelegKopfAdr_Obj
FROM PUB.V_BelegKopfAdr')

 

Ich habe schon soviel probiert, aber diese Version nicht. Danke sie läuft und somit eine Arbeitsgrundlage für die ganz langen Scripte.

Link to post

Klasse. Hätte ich auch gleich darauf kommen können. Wenn Du den Befehl direkt einer Variable zuweist, dann musst Du natürlich die gesamte Anweisung als String in Hochkomma setzen. Wenn Du den Befehl dann in einer Tabelle speicherst, dann ist das Feld bereits ein String und muss somit bei einer Zuweisung zu einer Variable nicht mehr in Hochkomma gesetzt werden.

  • Like 1
Link to post
vor 1 Minute schrieb winmadness:

Klasse. Hätte ich auch gleich darauf kommen können. Wenn Du den Befehl direkt einer Variable zuweist, dann musst Du natürlich die gesamte Anweisung als String in Hochkomma setzen. Wenn Du den Befehl dann in einer Tabelle speicherst, dann ist das Feld bereits ein String und muss somit bei einer Zuweisung zu einer Variable nicht mehr in Hochkomma gesetzt werden.

Nach dieser Erklärung ist alles ganz logisch, aber irgendwann habe ich den Wald vor lauter Bäumen nicht mehr gesehen und so lange beschäftige ich mich noch nicht mit MSSQL. 

Mir hat es sehr gut gefallen, dass ich nach so kurzer Zeit schon Infos und Anregungen erhalten habe. Vielen Dank an alle.

  • Like 2
Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...