Comment organiser ou éviter le type de table défini par l'user temporaire lors du passage de parameters évalués par la table

Comme il a été discuté ici: Passing List <> à la procédure stockée SQL et dans de nombreux autres endroits, une façon de passer la table en paramètre est d'utiliser SqlParameter.

Le problème avec ceci est qu'il nécessite de spécifier le type de table défini par l'user dans la propriété TypeName.

J'ai besoin de charger des données à partir d'un file Excel et de le passer en paramètre à SQL Statement qui joindra ces données avec d'autres tables de database pour get le résultat.

Pour ce faire, je devrais créer un type de table défini par l'user pour chaque variation possible du file Excel. Je ne veux pas polluer les types SQL avec ces types qui sont utilisés juste pour transmettre des données de chaque file Excel. Comment puis-je y parvenir?

Vous pouvez requestr comment je peux joindre quelque chose dont je ne sais pas le type – la réponse est – je connais les noms et les types de certains champs, mais pas tous. Aussi, si je veux returnner des données jointes en utilisant select *, cela fonctionnera avec n'importe quelle list de champs sans que je les mette en dur dans le type.

Je ne peux pas utiliser OPENROWSET pour joindre ce file directement à partir de SQL parce que j'ai 64 bits SQL Server et cela ne fonctionne pas en me donnant une erreur étrange.

Il existe un concept de tables temporaires dans SQL Server, mais il n'y a pas de concept de type temporaire, comment simuler un type temporaire ou éviter de l'utiliser lors du passage d'une table?

Je pourrais transmettre des données au format XML, mais cela semble less efficace si la taille des données est suffisante et que la taille des données est limitée à 2 Go.

Une façon de l'organiser est de créer un type, puis d'exécuter une instruction, puis de lâcher le type après ou d'utiliser TRY..CATCH et de déposer le type dans catch.

Un autre est de créer un schéma spécial, de générer des noms de types uniques dans ce schéma et de le nettoyer de time en time en utilisant le travail SQL de récupération de place. Et il peut être utilisé en combinaison avec la première façon juste pour nettoyer les rests.

D'autres suggestions ?

Vous ne devriez certainement pas créer une variable de table de 2 Go ou un type de données défini par l'user et le transmettre. Au lieu de cela, utilisez SSIS pour passer le file dans une sorte de table persistante ou de table temporaire, puis manipulez-le avec des procédures stockées. Même si vous avez réussi à get 2 Go de données dans une procédure stockée, la transaction durera si longtime qu'elle bloquera presque certainement d'autres transactions.

C'est aussi bon d'une réponse que vous pouvez espérer sans fournir des détails supplémentaires sur votre scénario.