Ich versuche, eine Reihe von SQL * Server-Schritten mit Dapper aus C # durchzuführen. Ein Schritt erstellt eine temporäre Tabelle und füllt sie auf. In den folgenden Schritten werden Daten aus der temporären Tabelle abgefragt. Das create / populate scheint erfolgreich ausgeführt zu werden, aber die erste Abfrage aus der temporären Tabelle schlägt fehl:
%Vor%"Ungültiger Objektname" #GetPageOfGlobalUsers '. "
Oben funktioniert die Ausführung, aber die Abfrage schlägt mit dem oben erwähnten Fehler fehl. (Beachten Sie, dass ich den gleichen Fehler bekomme, ob ich das Präfix "tempdb .." verwende oder nicht.) Wenn ich stattdessen eine permanente Tabelle erstelle (dh wenn ich den führenden Hash entferne) oder wenn ich eine globale temporäre Tabelle (dh Präfix) mache der Name mit zwei Hashes) alles funktioniert gut.
Ich verstehe, dass temporäre Tabellen, die mit einem einzelnen Hash benannt sind, auf die Dauer der Verbindung beschränkt sind, sodass ich nicht weiß, was passiert. Aber ich bin sicher, dass mir jemand das sagen kann!
(Übrigens, ich würde es begrüßen, wenn mir niemand sagt "mach es nicht so", es sei denn, es ist einfach nicht möglich.)
Ich verstehe nicht genau, was vor sich geht, aber ich kann das Problem umgehen, indem ich die temporäre Tabelle in einem eigenen Execute erzeuge, im Gegensatz zu einem Execute, der sowohl die Tabelle erstellt als auch füllt in dem Code in meiner Frage gezeigt.
Das heißt, das Folgende funktioniert:
%Vor% Das ist nicht schrecklich, aber es ist unbequem. Es ist erwähnenswert, dass ich die
Das Verhalten, das ich sehe, ist, dass, wenn die temporäre Tabelle im selben Execute erstellt und gefüllt wird, sie wirklich nicht in tempdb ist, nachdem Execute scheinbar erfolgreich beendet wurde. Das lässt mich darüber nachdenken, ob die Execute in meinem ursprünglichen Code überhaupt etwas zu tun hat! Für alles, was ich sagen kann, war es ein NOOP.
Ich vermute, dass die Verbindung nicht offen ist. Wenn ja, wird Dapper die Verbindung nach Bedarf öffnen und schließen (zurück zum Pool). Dadurch wird die Verbindung zurückgesetzt und alle temporären Tabellen zwischen Befehlen verloren.
Öffnen Sie die Verbindung explizit.
Folgendes funktioniert perfekt für mich:
%Vor%Es funktioniert auch perfekt, wenn ich Folgendes benutze:
%Vor%Der einzige Weg, wie ich verhindern kann, dass es funktioniert, ist laut meiner vorherigen Antwort die Verbindung nicht zuerst zu öffnen .
Tags und Links sql c# dapper temp-tables