exec fehlgeschlagen, weil der Name keine gültige Kennung ist?

71

Ich habe eine Abfrage, die ich als dynamische Abfrage ausführen muss, um einen aussagekräftigen Spaltennamen auszugeben. Wenn ich beispielsweise die Abfrage direkt ausführe, werden die Daten korrekt zurückgegeben. Wenn ich jedoch den folgenden Code verwende, wird Folgendes angezeigt:

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.

Darunter befindet sich der Code:

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;

Liegt es an der vollständigen Verbindung?

URL-Leser
quelle
Das tut mir leid. Ich habe eine Weile gebraucht, um herauszufinden, dass auf das Häkchensymbol geklickt werden kann.
URL-Leser

Antworten:

256

Versuchen Sie dies stattdessen am Ende:

exec (@query)

Wenn Sie nicht über die Klammern verfügen, geht SQL Server davon aus, dass der Wert der Variablen ein Name für eine gespeicherte Prozedur ist.

ODER

EXECUTE sp_executesql @query

Und es sollte nicht an FULL JOIN liegen.
Aber ich hoffe, Sie haben bereits die temporären Tabellen erstellt: #TrafficFinal, # TrafficFinal2, # TrafficFinal3 zuvor.


Bitte beachten Sie, dass zwischen der Verwendung von EXEC und sp_executesql Leistungsaspekte bestehen. Weil sp_executesql das Caching von erzwungenen Anweisungen wie ein sp verwendet.
Weitere Details hier .


Gibt es einen Grund, warum Sie in diesem Fall dynamisches SQL verwenden, wenn Sie die Abfrage unverändert verwenden können, wenn Sie keine Abfragemanipulationen durchführen und sie so ausführen, wie sie ist?

Kash
quelle
Dies liegt daran, dass der Spaltentitel, dh Empfängeranzahl 1, ..., durch eine Datumsvariable benutzerfreundlich sein muss.
URL-Leser
sp_executesql arbeitete für Massenladeeinfügungen aus Dateien, wohingegen exec dies nicht tat.
Elan Hasson
1
Du bist ein Lebensretter. Ich habe seit gestern gekämpft
Rob
2

Wie in meinem Fall, wenn Ihre SQL durch Verketten generiert wird oder Konvertierungen verwendet, muss SQL bei der Ausführung der Buchstabe N wie unten vorangestellt werden

z.B

Exec N'Select bla..' 

Das N definiert das String-Literal als Unicode.

Moji
quelle