SQL Server 2008 Dynamique de la Requête à l'aide de la CTE
Je suis en train d'écrire une Requête Dynamique qui utilise une expression de table commune. Mais je suis confronté à des problèmes - voir ci-dessous
C'est un cas simplifié
declare @DynSql varchar(max)='';
declare @cnt as integer;
with months as (
select CAST('07/01/2010' as DATE) stdt
UNION ALL
SELECT DATEADD(MONTH,1,STDT) FROM months
WHERE DATEADD(MONTH,1,STDT)<CAST('06/30/2011' AS DATE)
)
select COUNT(*) from months
set @DynSql='select * from months'
exec (@DynSql)
Cela ne fonctionne pas - l'erreur que j'obtiens est
Nom d'Objet non valide 'Mois'
Est-il possible de réaliser ce que je veux. Il travaillera si j'utilise de la table temporaire ou une variable de table.
Vous ne pouvez pas référence à la cce de l'intérieur de la cte.
pourquoi avez-vous besoin
Si je n'ai pas mis select count(*) il se plaint de "CTE pas utilisé". Je suis en train de créer un pivot de la requête avec mois à l'échelle de l'axe Y.Le nombre de mois est variable. donc je vais devoir créer pivot quelque chose comme pivot(somme(fld) pour le col(['jan-10'],['fév-10']...)
Je pense que vous pouvez peut-être surplombant le plus grand message envoyé par SQL Server: à ne pas faire des tableaux croisés dynamiques en T-SQL. La langue n'était tout simplement pas faite pour cela et vous devez sauter à travers beaucoup de problèmes pour le faire fonctionner. Utiliser un outil de reporting ou de le faire dans un composant de couche intermédiaire.
pourquoi avez-vous besoin
select COUNT(*) from months
? et pourquoi avez-vous besoin d'une dynamic
requête?Si je n'ai pas mis select count(*) il se plaint de "CTE pas utilisé". Je suis en train de créer un pivot de la requête avec mois à l'échelle de l'axe Y.Le nombre de mois est variable. donc je vais devoir créer pivot quelque chose comme pivot(somme(fld) pour le col(['jan-10'],['fév-10']...)
Je pense que vous pouvez peut-être surplombant le plus grand message envoyé par SQL Server: à ne pas faire des tableaux croisés dynamiques en T-SQL. La langue n'était tout simplement pas faite pour cela et vous devez sauter à travers beaucoup de problèmes pour le faire fonctionner. Utiliser un outil de reporting ou de le faire dans un composant de couche intermédiaire.
OriginalL'auteur josephj1989 | 2010-06-18
Vous devez vous connecter pour publier un commentaire.
Votre SQL dynamique ne peut pas faire référence
months
. Le champ d'application de la CTE est un seul déclaration:Si vous voulez ré-utiliser la CTE du résultat ou de la définition, vous devez re-définir la CTE chaque fois que vous voulez utiliser (par exemple. dans le @DynSql) ou de matérialiser son résultat dans une table de la fonction @variable et la ré-utilisation de la table de la fonction @variable.
dynamique sql est exécutée dans un autre champ. Fondamentalement, est un appel de fonction. Il ne peut pas faire référence à des variables à partir de votre contexte actuel. Vous devez passer toutes les variables que vous souhaitez utiliser à partir de l'actuel champ d'application/contexte comme un paramètre, en utilisant
exec sp_executesql @DynSql, '@parameterName type', @localTVP
.Voir msdn.microsoft.com/en-us/library/bb510489.aspx pour un exemple comment passer un tableau local de la fonction @variable à une procédure.
J'ai créé une variable de table avec CTE et a essayé de passer dans sp_execsql mais il n'accepte pas les variables de table.
OriginalL'auteur Remus Rusanu
Avec le mot clé n'a pas déclarer un objet qui peut être référencée dans les plus tard requêtes. Il fait partie de la requête select. Votre sql dynamique essayait de référence à un objet
months
qui n'existe pas. Inclure la CTE dans la chaîne de la définition de la dyanic requête.Cependant, je ne vois pas ce que vous gagnez en faisant le SQL dynamique, puisque rien dans l'instruction SQL varie.
Si vous souhaitez qu'un objet, vous pouvez référencer plus tard, vous pouvez créer une vue (une fois) qui pourraient être utilisés par votre requête dynamique, et les requêtes semblables (de nombreuses fois).
Oui, sans vue, vous aurez besoin de créer de la CCE à l'intérieur du SQL dynamique. Je ne comprends pas quel est le problème. Peut-être que la publication de plus de votre problème, avec le message d'erreur serait de les aider.
OriginalL'auteur Shannon Severance
Bien je l'ai eu à travailler, mais je ne comprends pas la portée de cette...
Révision maintenant que j'ai des informations de déplacement:
Eh bien maintenant, je vois que vous essayez d'utiliser le Pivot(). Avec les données que vous avez fournies, vous obtiendrez un point de référence. Qu'essayez-vous de le comparer avec d'? Un peu plus d'infos et je peux utiliser le cte.
Presque fini avec un ré-écrire...
Le commentée de la partie est pour le pivot qui je ne peut pas se rendre au travail à l'heure actuelle.
OriginalL'auteur websch01ar
Vous ne pouvez pas utiliser cette CTE ou @TableVariable dans une dynamique sql, mais vous pouvez utiliser une table #Temp pour cela. Créer une table temporaire, stocker les données dans que ( u pouvez copier vos résultats CTE de la table temporaire) et de l'utiliser dans la requête dynamique. C'est la solution.
OriginalL'auteur Abdul Rasheed