/ / Comment créer une table temporaire locale à la connexion, sans être obligé d'utiliser une simple instruction de création de table explicite? - .net, scope, sql-server-2012, temp-tables, sqlcommand

Comment créer une table temporaire locale à la connexion, sans être obligé d'utiliser une simple instruction de création de table explicite? - .net, scope, sql-server-2012, temp-tables, sqlcommand

Je veux créer une table temporaire qui soit localeà la SqlConnection, en utilisant une instruction de la forme "select into #tempTable", car je n'ai pas besoin de spécifier les noms et les types de colonnes, comme je le ferais avec une instruction "create table #tempTable";

Je veux que la table temporaire soit visible deSqlCommands suivants s'exécutant sur le même SqlConnection déjà ouvert, et uniquement sur cette connexion. Je ne veux pas utiliser de tables temporaires globales, car je ne veux pas avoir à gérer les conflits de noms lorsque la requête est exécutée simultanément.

J'ai découvert qu'une table temporaire locale est visible pourLes commandes SqlCommandes suivantes uniquement si elles sont créées avec une simple instruction "create table #tempTable" sans paramètres SQL. Par contre, si elles sont créées avec une instruction "select into" avec des paramètres (ou avec d'autres instructions dans un seul SqlCommand), alors cela fait que tout soit exécuté dans une procédure, ce qui limite la portée de la table temporaire à cette procédure.

En général, il semble impossible d'utiliser temptables à travers SqlCommands lorsque ces commandes SqlCommands sont différentes des simples instructions "create table" sans paramètres, en raison du fonctionnement interne de SqlCommand.

Créer la table temporaire séparément fonctionnerait (i.e. une simple instruction "create table #tempTable (col type, col type, etc.)" sans paramètre SQL), mais qui implique de spécifier explicitement tous les types de colonnes (trop de maintenance, IMO), alors qu'avec un "select into "déclaration, je n'ai pas besoin de spécifier les types de colonnes car ils correspondent aux colonnes source automatiquement.

Je souhaite qu'une table temporaire créée avec "select into" persiste tant que la connexion est ouverte. Y a-t-il un moyen d'étendre la table à la connexion ouverte?

En l’état actuel, c’est vraiment imprévisiblecomportement, car en fonction de la construction de SqlCommand, il peut ou peut ne pas s’emballer dans une procédure stockée, donc une table temporaire créée dans SqlCommand peut être ou ne pas être visible pour les commandes Sql suivantes exécutées sur cette même connexion ouverte.

Réponses:

3 pour la réponse № 1

Comme indiqué dans les commentaires, vous codez votre code SQL en C # en tant que chaîne C #. Ainsi, vous pouvez créer une table temporaire avec le nom de votre choix.

Je vais laisser les détails de la mise en œuvre à vous, mais ce fragment devrait vous permettre de progresser:

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();
}
}
}

certainement un exemple simpliste - mais devrait vous mettre sur la bonne voie.

En ce qui concerne les tables temporaires de connexion en tant que fonctionnalité fournie par la base de données ... Je n'ai jamais entendu parler de cela. Cela ne signifie pas qu'elles n'existent pas.