2012-08-16 49 views
44

Tengo una consulta. Necesito ejecutarla como una consulta dinámica para generar un nombre de columna significativo. Como ejemplo, si ejecuto la consulta directamente, devuelve datos correctamente. Sin embargo, si uso por debajo de código, se muestra:¿ejecutó error porque el nombre no es un identificador válido?

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. 

A continuación es el código:

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; 

¿Es debido a la plena unirse?

+0

perdón por eso. Me tomó un tiempo descubrir que se puede hacer clic en el símbolo de verificación. – urlreader

Respuesta

155

Tal vez puedas probar en el extremo:

exec (@query) 

Si usted no tiene los soportes, SQL Server asume el valor de la variable a ser un nombre de procedimiento almacenado.

O

EXECUTE sp_executesql @query 

Y no debería ser debido a full join.
Pero espero que ya haya creado las tablas temporales: #TrafficFinal, # TrafficFinal2, # TrafficFinal3 antes de esto.


Tenga en cuenta que existen consideraciones de rendimiento entre el uso de EXEC y sp_executesql. Porque sp_executesql utiliza el almacenamiento en caché de sentencias forzadas como un sp.
Más detalles here.


Por otro lado, hay una razón por la que está utilizando SQL dinámico para este caso, cuando se puede utilizar la consulta como es, teniendo en cuenta que no está haciendo ninguna manipulación de consulta y ejecución de la manera que es?

+1

muchas gracias, ¡sabía que echaba de menos algo simple! :) – urlreader

+0

es porque el título de la columna, es decir, el recuento de receptor 1 ... debe ser fácil de usar por una variable de fecha. – urlreader

+1

Acabo de encontrarme con el mismo problema, gracias por la solución. Me siento tonto no porque fuera tan simple. – Jackson

0

como fue en mi caso si su SQL se genera mediante la concatenación o usos convertidos a continuación, SQL a ejecutar necesidad de ir precedidos por la letra N de la siguiente manera

por ejemplo,

Exec N'Select bla..' 

la N define la cadena literal es unicode.

Cuestiones relacionadas