Benutzer mit den meisten Antworten
CHANGETABLES in View auslagern - LastChangeId kann nicht übergeben/ausgelesen werden

Frage
-
Hallo zusammen,
wir wollen gerade ein Programm entwickeln, welches sich automatisch Datenänderungen aus der Datenbank zieht und diese als Dateien bereitstellt. Hierfür speichern wir die ID's der Datensätze (z.B. von Kunden oder Artikeln) in jeweils eine Tabelle. Diesen Schritt müssen wir machen, da wir nicht wissen, wie groß die Datenmenge ist und wir ggf. die Datenmenge aufsplitten müssen. Dies machen wir bislang über eine Stored Procedure, welche auch das CHANGETABLES ausführt.
Da wir bei dem aktuellen Projekt über 10 verschiedene Schnittstellen benötigen und das Projekt später auch in anderen Projekten eingesetzt werden soll, wollen wir so viel wie möglich automatisieren. Da die StoredProcedure für jedes Projekt gleich aussieht und nur die Daten aus dem CHANGEABLES abweichen, haben wir uns überlegt, das CHANGETABLES in einen VIEW auszulagern. So hätten wir nur eine Standardprocedure zum auslesen des Views und eintragen der Daten, dafür dann 10 (oder mehr) Views, die als Datengrundlage dienen.
Nur kurz zu Anfang: Mir ist klar, das wir auch einfach 10 Procedures anlegen könnten und dies wahrscheinlich ähnlich viel Arbeit machen würde :) ich möchte gerne eine Trennung, da ich es übersichtlicher finde.
Zu meinem Problem: Wenn ich das CHANGETABLE in einen VIEW auslagern will, dann meckert er mich immer an. Das Problem ist die LastChangId, diese wird in der Procedure per Variable gefüllt, in dem View kann ich dies nicht (laut meinem Kenntnisstand) daher möchte ich diese über eine SQL-Klausel füllen. Das scheint MSSQL nicht zu mögen.
Mein Code in der Procedure
SET @lastChangeId = (SELECT Value FROM Variables WHERE Process = 2); DECLARE @ids TABLE(ID int); INSERT INTO @ids SELECT art.ID FROM CHANGETABLE(CHANGES dbo.tblArticles, @lastChangeId) AS art
Mein Code im View:
SELECT art.ID FROM CHANGETABLE(CHANGES dbo.tblArticles, (SELECT Value FROM Variables WHERE Process=2)) AS art
Fehlermeldung:
Incorrect syntax near 'SELECT', Expecting ID or QUOTED_ID
Soweit ich es gelesen habe, benötigt CHANGETABLE als 2. Parameter einen BIGINT, etwas anderes nimmt er dort nicht an, weder als SQL, noch als Function (habe ich auch versucht). Hat noch jemand von euch eine Idee, was ich versuchen könnte?
VG und danke fürs lesen,
Thomas
Antworten
-
Hallo Thomas,
vor allem muss der Wert skalar sein, wie auch in der Dokumentation steht:
Last_sync_version ist "bigint". Der Wert muss skalar sein. Ein Ausdruck verursacht einen Syntaxfehler.
Verwende entweder eine Prozedur oder z. B. CROSS APPLY um eine nichtzulässige Funktion oder Unterabfrage an der Stelle zu vermeiden, wenn du es unbedingt in eine Sicht quetschen willst.
Gruß Elmar
- Als Antwort vorgeschlagen Holger M. Rößler Mittwoch, 22. Februar 2017 14:07
- Als Antwort markiert Worphauser Mittwoch, 22. Februar 2017 14:21
Alle Antworten
-
Hallo Thomas,
mit CHANGETABLE kenne ich mich nicht so aus.
Aber Du solltest schon beschreiben wie deine Tabellen aussehen - also z.B. Variables und dbo.tblArticles.
Variables scheint Process und Value zu enthalten. Value ist ein Schlüsselwort - also beim Select besser in eckige Klammern verpacken.
Es kann sein, dass die Fehlermeldung auch in der Procedure auftritt, aber erst zur Laufzeit.
Gruß
Willi
-
Hallo Thomas,
vor allem muss der Wert skalar sein, wie auch in der Dokumentation steht:
Last_sync_version ist "bigint". Der Wert muss skalar sein. Ein Ausdruck verursacht einen Syntaxfehler.
Verwende entweder eine Prozedur oder z. B. CROSS APPLY um eine nichtzulässige Funktion oder Unterabfrage an der Stelle zu vermeiden, wenn du es unbedingt in eine Sicht quetschen willst.
Gruß Elmar
- Als Antwort vorgeschlagen Holger M. Rößler Mittwoch, 22. Februar 2017 14:07
- Als Antwort markiert Worphauser Mittwoch, 22. Februar 2017 14:21