Mit Hilfe von dapper wird eine temporäre Tabelle erstellt, die bei einer Verwendung einer Verbindung bei einer zweiten Verwendung derselben Verbindung nicht verfügbar ist

8

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:

  

"Ungültiger Objektname" #GetPageOfGlobalUsers '. "

%Vor%

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

    
Bob Wolfson 12.02.2014, 17:16
quelle

3 Antworten

6

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 -Tabelle lieber nicht explizit erstellen möchte. In der Tat hatte ich die create / populate-Operation ursprünglich als SELECT INTO codiert, so dass ich die Spalten der temporären Tabelle nicht auflisten musste. Aber das führte auch zu dem Fehler "ungültiges Objekt" bei der folgenden Abfrage, also versuchte ich die explizite CREATE TABLE, um zu sehen, ob es einen Unterschied machte und meine Frage hier gepostet hatte, nachdem ich festgestellt hatte, dass dies nicht der Fall war.

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.

    
Bob Wolfson 13.02.2014, 01:47
quelle
3

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.

    
Marc Gravell 12.02.2014 18:54
quelle
1

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 .

    
Marc Gravell 19.02.2014 08:59
quelle

Tags und Links