Jump to content

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


Direkt zur Lösung Gelöst von winmadness,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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 zu diesem Kommentar
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 zu diesem Kommentar
  • Beste Lösung

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')

 

bearbeitet von winmadness
Link zu diesem Kommentar
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 zu diesem Kommentar

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.

Link zu diesem Kommentar
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.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...