/ / Wie erstellt man eine temporäre Tabelle, die für die Verbindung lokal ist, ohne gezwungen zu sein, eine einfache explizite Anweisung create table zu verwenden? - .net, Bereich, SQL-Server-2012, temporäre Tabellen, sqlcommand

Wie erstellt man eine temporäre Tabelle, die für die Verbindung lokal ist, ohne gezwungen zu sein, eine einfache explizite Anweisung create table zu verwenden? - .net, Bereich, SQL-Server-2012, temporäre Tabellen, sqlcommand

Ich möchte eine temporäre Tabelle erstellen, die lokal istan die SqlConnection mit einer Anweisung der Form "select in #tempTable", weil ich Spaltennamen und -typen nicht angeben muss, wie ich es bei einer Anweisung "create table #tempTable" tun würde;

Ich möchte, dass die Tempentabelle von sichtbar istnachfolgende SqlCommands, die auf derselben bereits geöffneten SqlConnection ausgeführt werden, und nur für diese Verbindung. Ich möchte nicht globale temporäre Tabellen verwenden, weil ich nicht mit Namenskonflikten umgehen möchte, wenn die Abfrage gleichzeitig ausgeführt wird.

Ich entdeckte, dass eine lokale temporäre Tabelle sichtbar istnachfolgende SqlCommands nur, wenn es mit einer einfachen, einzigen "create table #tempTable" -Anweisung ohne SQL-Parameter erstellt wurde. Andererseits, wenn es mit einer "select in" -Anweisung mit Parametern erstellt wurde (oder zusammen mit anderen aufgereiht wurde) Anweisungen in einem einzigen SqlCommand), dann bewirkt dies, dass das Ganze in einer Prozedur ausgeführt wird, die den Umfang der temporären Tabelle auf diese Prozedur beschränkt.

Im Allgemeinen scheint es unmöglich zu sein, tempTabellen über SqlCommands, wenn diese SqlCommands etwas anderes sind als einfache "create table" -Anweisungen ohne Parameter, weil der SqlCommand intern funktioniert.

Das separate Erstellen der temporären Tabelle würde funktionieren (i.e. eine einfache Anweisung "create table #tempTable (col type, col type, etc.)" ohne SQL-Parameter, aber das beinhaltet explizit die Angabe aller Spaltentypen (was zu viel Wartung ist, IMO), während mit einem "Auswählen in "Anweisung, ich muss die Spaltentypen nicht angeben, da sie automatisch mit den Quellspalten übereinstimmen.

Ich möchte eine temporäre Tabelle, die mit "Auswählen in" erstellt wurde, beibehalten, solange die Verbindung offen ist. Gibt es eine Möglichkeit, die Tabelle auf die offene Verbindung zu beschränken?

So wie es jetzt aussieht, ist es wirklich unberechenbarVerhalten, weil abhängig davon, wie der SqlCommand konstruiert wird, kann es sich selbst oder nicht in eine gespeicherte Prozedur einhüllen, so dass eine in einem SqlCommand erstellte temporäre Tabelle für nachfolgende SqlCommands, die auf derselben offenen Verbindung ausgeführt werden, sichtbar sein kann.

Antworten:

3 für die Antwort № 1

Wie in den Kommentaren hervorgehoben wurde, codieren Sie Ihr SQL in C # als C # -Strings. So können Sie eine temporäre Tabelle mit einem beliebigen Namen erstellen.

Ich werde die Details der Implementierung Ihnen überlassen, aber dieses Fragment sollte Sie auf den Weg bringen:

public function DoSomeSqlStuff() {
var tempTableName = CreateTempTableName();
using SqlConnection connection = new SqlConnection(connectionString) {
using SqlCommand firstCommand = new SqlCommand("CREATE TABLE #" + tempTablename + "column definitions here", connection) {
firstCommand.ExecuteNonQuery();
}

using SqlCommand secondCommand = new SqlCommand("SELECT * FROM #" + tempTableName, connection) {
secondCommand.ExecuteReader();
}

using SqlCommand thirdCommand = new SqlCommand("DROP TABLE #" + tempTableName, connection) {
thirdCommand.ExecuteNonQuery();
}
}
}

Sicherlich ein simples Beispiel - aber sollte Sie auf den richtigen Weg bringen.

Wie für verbindungsorientierte temporäre Tabellen als eine Funktion, die von der Datenbank bereitgestellt wird ... Ich habe noch nie von so etwas gehört. Bedeutet nicht, dass sie nicht existieren.