/ / Les procédures stockées ne voient pas la table temporaire créée dans la même connexion - c #, sql, .net, sql-server, visual-studio

Les procédures stockées ne voient pas la table temporaire créée dans la même connexion - c #, sql, .net, sql-server, visual-studio

Pourquoi ma table temporaire est-elle supprimée?

Actuellement, nous avons:

var listOfSqlCommands = new List<SqlCommand>();

Il est peuplé d'un SqlCommand avec CommandType = CommandType.StoredProcedure;

Informations d'arrière-plan:

  • Je crée une table temporaire (cela crée un SqlCommand)
  • Ensuite, prenez une liste de procédures stockées et créez un SqlCommand pour chacun
  • J'ai besoin d'utiliser la table temporaire pour les autres commandes
  • Après avoir fait une trace de SQL Server, je n’ai trouvé aucune indication que sp_executesql était utilisé. Le profileur a montré que la table temporaire était en cours de création avec un exec CreateTempTableSproc

Code complet:

var listOfSqlCommands = new List<SqlCommand>();

using (var O0aAConnection = new SqlConnection(connectionString))
{
try
{
O0aAConnection.Open();

foreach (DataTable dt in ds.Tables)
{
EntityName = StringDefaultIfNull(syncConfig.Root.XPathSelectElement("./entity[@name="" + dt.TableName + ""]"), "O0aATableName").Substring(3);

var O0aACommand = new SqlCommand();

O0aACommand.CommandType = CommandType.StoredProcedure;
O0aACommand.CommandText = "O0aA42_P_" + EntityName + "Sync_OfferingPublish";

var entityNameParam = new SqlParameter("@EntityName", dt.TableName);

O0aACommand.Parameters.Clear();
O0aACommand.Parameters.Add(entityNameParam);

var tblParam = new SqlParameter("@O42_" + EntityName, SqlDbType.Structured);
tblParam.Value = dt;
O0aACommand.Parameters.Add(tblParam);

O0aACommand.Connection = O0aAConnection;

listOfSqlCommands.Add(O0aACommand);
}

using (var createTempTableCommand = new SqlCommand())
{
createTempTableCommand.CommandText = "CreateTempTableSproc";
createTempTableCommand.CommandType = CommandType.StoredProcedure;
createTempTableCommand.Connection = O0aAConnection;

createTempTableCommand.ExecuteNonQuery();
}

// the commands here are NOT seeing the temp table that was created above!!
foreach (var command in listOfSqlCommands)
{
using (var da = new SqlDataAdapter(command))
{
da.Fill(dtResults);
}
}
}
finally
{
O0aAConnection.Close();
}
}

Pourquoi ma table temporaire est-elle supprimée?

Réponses:

3 pour la réponse № 1

Les tables temporaires (locales et globales) n'existent que dans le contexte de la session OU dans la procédure stockée dans laquelle elles ont été créées.

Vous ne devez pas utiliser une procédure stockée pour le créer.

EXEC créera également un contexte pour les tables temporaires qui disparaîtront à leur retour si elles sont créées dans EXEC. Le code appelé par EXEC verra les tables temporaires existantes.


1 pour la réponse № 2

Vous pouvez CHAÎNER les résultats d'une procédure stockée

Par exemple:

CREATE PROCEDURE [dbo].[prcCall1]
As
Begin
Select Val=1 into #Temp
Exec [prcCall2]
Select * from #Temp
End

Go

CREATE PROCEDURE [dbo].[prcCall2]
As
Begin
Update #Temp Set Val=Val+1
--Select * from #Temp
End

Go

Exec [dbo].[prcCall1]

Résultats

Val
2