À l'aide de la table temporaire avec exec @sql dans une procédure stockée
J'ai une procédure stockée et une partie d'entre eux comme ci-dessous:
@DRange est un entrant valeur varchar
declare @sql varchar(max)
set @sql = 'select * into #tmpA from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1'
exec (@sql)
select * from #tmpA
Le problème est que lorsque j'exécute la procédure stockée, un message d'erreur apparaît:
Ne peut pas trouver l'objet "#tmpA" parce qu'il n'existe pas ou vous ne disposez pas des autorisations.
Est-il pas possible d'utiliser la table temporaire et de l'exécuter ou ai-je fais quelque chose de mal?
Pourquoi utiliser du SQL dynamique? Ne pouvez-vous pas normal de requête
Parce que j'aurai besoin de combiner les autres paramètres, tels que le nom de base de données dans la requête.
select * into #tmpA from TableA where create_date >= getDate - @DRange and is_enabled = 1
? Covert @DRange dans différents type si nécessaireParce que j'aurai besoin de combiner les autres paramètres, tels que le nom de base de données dans la requête.
OriginalL'auteur William Tang | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
#tmpA
est créé dans un autre champ, n'est donc pas visible à l'extérieur du SQL dynamique. Vous pouvez simplement faire l'ultimeSELECT
une partie du SQL dynamique. Aussi un couple de d'autres choses:sp_executesql
pour le SQL dynamique; dans ce cas, il vous permet de paramétrer le@DRange
valeur et éviter les risques d'injection SQL.N
- Unicode est nécessaire poursp_executesql
mais si vous êtes paresseux à ce sujet dans d'autres domaines de votre code, il peut aussi conduire à un douloureux conversions implicites.Bien sûr, si tout ce que vous avez à faire est de choisir, j'ai du mal à comprendre pourquoi c'est du SQL dynamique en premier lieu. Je suppose que votre requête (ou ce que vous faire plus tard avec la table temporaire) est plus compliqué que cela - si oui, ne pas muet pour nous. Nous faire part de votre problème permettra d'éviter beaucoup de va-et-vient, comme les détails supplémentaires pourraient changer la réponse.
non, il n'a pas. Savez-vous ce ##tmpA? Cela crée un MONDIAL de la table temporaire. Devinez ce qui se passe lorsque deux personnes exécuter cette procédure stockée dans le même temps (quel que soit l'intervalle de date ou de la base de données paramètres).
OriginalL'auteur Aaron Bertrand
Voici ce que j'avais à faire.
OriginalL'auteur Sani