2010-10-15 6 views
0

Pour faire une histoire courte ...Construire une table temporaire avec SQL dynamique dans SQL Server 2008

Je construis une application Web dans laquelle l'utilisateur peut sélectionner une combinaison d'environ 40 paramètres. Cependant, pour l'un des résultats souhaités (expérience d'investissement), je dois extraire des informations d'une table différente et comparer les valeurs dans six colonnes différentes (stock exp, fonds mutuels exp, etc.) et retourner uniquement la valeur la plus élevée des six pour cet enregistrement spécifique.

Ce n'est pas le problème. Le problème est que lors de l'exécution, ma requête pour trouver l'investissement exp ne connaît pas nécessairement l'identifiant du compte. Considérant qu'un scan de table apporterait bien plus d'un demi-million de clients, ce n'est pas une option. Donc ce que j'essaye de faire est d'éditer une copie de ma requête principale construite dynamiquement, mais au lieu de renvoyer 30+ colonnes, ça retournera simplement 2, l'accountid et l'experienceid (qui est le PK pour la table d'expérience) donc je peut faire l'affaire de filtrage.

Certains d'entre vous peuvent définir un SQL dynamique un peu différent de moi-même. Ma requête est une chaîne qui, selon les arguments envoyés à ma procédure, des parties de la clause where seront activées ou désactivées par des commutateurs. À la fin je l'exécute, tout est fait du côté serveur, toute l'application web envoie un tableau d'arguments à mon proc.

Mon plus code simplifié ressemble essentiellement comme ceci:

declare @sql varchar(8000) 
set @sql = 
'select [columns] 
into #tempTable 
from [table] 
[table joins]' + @dynamicallyBuiltWhereClause 

exec(@sql) 

après cette partie j'essaie d'utiliser #temptable pour le processus de filtrage de l'expérience de l'investissement, mais je reçois une erreur me disant #temptable n'existe pas.

Une aide précieuse serait grandement appréciée.

Répondre

2

Le problème est que la portée de votre table temporaire n'existe que dans l'instruction exec(). Vous pouvez transformer votre table temporaire en une table temporaire "globale" en utilisant 2 signes de hachage -> ## tempTable. Cependant, je me demande pourquoi vous utilisez une variable @dynamicallyBuiltWhereClause pour générer votre instruction SQL.

J'ai fait ce que vous faisiez dans le passé, mais j'ai eu plus de succès en générant du SQL à partir de l'application (en utilisant C# pour générer mon SQL).

Aussi, vous pouvez vouloir regarder dans les variables de table. J'ai vu des instances étranges utilisant des tables temporaires où une application réutilise une connexion et la table temporaire de la dernière requête est toujours là.

+0

bien que ma procédure va recevoir 40+ arguments par défaut à null, et une série de vérifications de valeur agira comme commuté pour construire la clause where. Merci d'ailleurs, j'ai complètement oublié la portée (je suis nouveau) et les 2 signes de hachage ont aidé. Merci. – IWriteApps

Questions connexes