84 votes

exec a échoué parce que le nom n'est pas un identifiant valide ?

J'ai une requête que je dois exécuter en tant que requête dynamique pour obtenir un nom de colonne significatif. Par exemple, si j'exécute la requête directement, elle renvoie les données correctement. Cependant, si j'utilise le code ci-dessous, les données s'affichent :

The name '
            SELECT (CASE WHEN A.Domain IS NOT NULL THEN A.Domain ELSE B.Domain END) AS [Domain], 
                    (CASE WHEN A.Email IS NOT NULL THEN A.Email ELSE B.Email END) AS [Email], 
                    A.[Sender Size] AS [Sender Size 1], A.[Sender Count] AS [Sender Count 1],
                        A.[Receiver Size] AS [Receiver Size 1], A.[Receiver Count] AS [Receiver Count 1],
                    A.[Sender Size 2] AS [Sender Size 2], A.[Sender Count 2] AS [Sender Count 2],
                        A.[Receiver Size 2] AS [Receiver Size 2], A.[Receiver Count 2] AS [Receiver Count 2],
                    B.SenderSize AS [Sender Size Average], B.SenderCount AS [Sender Count Average],
                        B.ReceiverSize AS [Receiv' is not a valid identifier.

Le code se trouve en dessous :

DECLARE @query NVARCHAR(4000)
SET @query = N'SELECT *
            FROM
            (
                SELECT (CASE WHEN A.Domain IS NOT NULL THEN A.Domain ELSE B.Domain END) AS [Domain], 
                        (CASE WHEN A.Email IS NOT NULL THEN A.Email ELSE B.Email END) AS [Email], 
                        A.[Sender Size] AS [Sender Size 1], A.[Sender Count] AS [Sender Count 1],
                            A.[Receiver Size] AS [Receiver Size 1], A.[Receiver Count] AS [Receiver Count 1],
                        A.[Sender Size 2] AS [Sender Size 2], A.[Sender Count 2] AS [Sender Count 2],
                            A.[Receiver Size 2] AS [Receiver Size 2], A.[Receiver Count 2] AS [Receiver Count 2],
                        B.SenderSize AS [Sender Size Average], B.SenderCount AS [Sender Count Average],
                            B.ReceiverSize AS [Receiver Size Average], B.ReceiverCount AS [Receiver Count Average]
                FROM
                    (
                    SELECT (CASE WHEN tf.Domain IS NOT NULL THEN tf.Domain ELSE tf2.Domain END) AS Domain, 
                            (CASE WHEN tf.Email IS NOT NULL THEN tf.Email ELSE tf2.Email END) AS Email, 
                         ISNULL(tf.SenderSize,0) AS [Sender Size] , ISNULL(tf.SenderCount,0) AS [Sender Count], ISNULL(tf.ReceiverSize,0) AS [Receiver Size], ISNULL(tf.ReceiverCount,0) AS [Receiver Count], 
                         ISNULL(tf2.SenderSize,0) AS [Sender Size 2], ISNULL(tf2.SenderCount,0) AS [Sender Count 2], ISNULL(tf2.ReceiverSize,0) AS [Receiver Size 2], ISNULL(tf2.ReceiverCount,0) AS [Receiver Count 2] 
                    FROM #TrafficFinal tf FULL JOIN #TrafficFinal2 tf2 ON (tf.Email = tf2.Email AND tf.Domain = tf2.Domain)
                    ) A FULL JOIN #TrafficFinal3 B ON (A.Email = B.Email AND A.Domain = B.Domain)
            ) C
            ORDER BY Domain, Email';    

PRINT @query;

-- run it
exec @query;

Est-ce à cause de la jonction totale ?

302voto

Kash Points 3540

Essayez plutôt ceci à la fin :

exec (@query)

Si vous n'avez pas les parenthèses, SQL Server suppose que la valeur de la variable est un nom de procédure stockée.

OU

EXECUTE sp_executesql @query

Et ce ne devrait pas être à cause du FULL JOIN.
Mais j'espère que vous avez déjà créé les tables temporaires : #TrafficFinal, #TrafficFinal2, #TrafficFinal3 avant cela.


Veuillez noter que l'utilisation d'EXEC et de sp_executesql a des répercussions sur les performances. Parce que sp_executesql utilise la mise en cache forcée des instructions comme un fichier sp.
Plus de détails aquí .


Par ailleurs, y a-t-il une raison pour laquelle vous utilisez du SQL dynamique dans ce cas, alors que vous pouvez utiliser la requête telle quelle, étant donné que vous ne faites aucune manipulation de la requête et que vous l'exécutez telle qu'elle est ?

2voto

Manoj Sharma Points 373

Comme dans mon cas, si votre code SQL est généré par concaténation ou utilise des convertisseurs, le code SQL à exécuter doit être préfixé par la lettre N, comme suit

par exemple

Exec N'Select bla..' 

le N définit le littéral de la chaîne est unicode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X