2011-08-22 9 views
5

Estoy intentando escribir un procedimiento almacenado para Crystal Reports combinando varias consultas en un único conjunto de resultados (Crystal no admite resultados múltiples en un informe).¿Cómo selecciono correctamente INTO @TempTable varias veces para devolver un solo conjunto de resultados?

El conjunto de resultados que intento obtener combina columnas de ambas tablas.

En el SP, declaro @temptable y las columnas (porque las dos tablas que estoy consultando tienen columnas diferentes).

DECLARE @TEMPNEWBILLING TABLE 
(
    ACCOUNT DECIMAL null, 
    CLIENT NVARCHAR null, 
    TIMESTAMP INT null, 
    BILLING DECIMAL null, 
    CALLKIND INT null, 
    HITK1 DECIMAL null, 
    HITK2 DECIMAL null, 
    HIDISC DECIMAL null, 
    HITALK DECIMAL null, 
    HIPTCH DECIMAL null, 
    HICONF DECIMAL null, 
    HIHOLD DECIMAL null, 
    PTCH DECIMAL null, 
    SUPERTIME DECIMAL null 
) 

Entonces SELECT de ambas tablas INTO la tabla temporal:

SELECT Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,  HiConf, HiHold, Ptch 
INTO TEMPNEWBILLING 
FROM 
     mCallEnd 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 
    AND CallKind in (0,1,2,3,4,16) 

SELECT 
    Billing, SuperTime 
INTO TEMPNEWBILLING 
FROM 
     mClientMaint 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 

Y, por último, que acaba de obtener todos los datos de la tabla temporal.

SELECT * FROM @TEMPNEWBILLING 

Por desgracia, algo va mal, como cuando corro el SP, me sale un error que

Ya existe un objeto denominado 'TEMPNEWBILLING' en la base de datos.

Lo he comprobado y parece que la primera consulta se está ejecutando, pero el error se produce en el segundo Seleccione en. Debo estar haciendo esto mal, ya que obtengo el mismo error si uso # tablas o @ tablas (es decir, delcare la tabla vs. crear la tabla).

¿Es la posibilidad de llenar una tabla temporal con los resultados de dos consultas simplemente imposible? ¿Estoy usando la herramienta incorrecta para el trabajo?

Respuesta

11

En su código, no está utilizando la tabla de variables definida, sino que intenta colocar los resultados en la misma tabla física. Pruebe esto en su lugar:

INSERT INTO @TEMPNEWBILLING(Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,  HiConf, HiHold, Ptch) 
SELECT Account, Client, Timestamp, Billing, CallKind, HiTk1, HiTk2, HiDisc, HiTalk, HiPtch,  HiConf, HiHold, Ptch 
FROM 
     mCallEnd 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 
    AND CallKind in (0,1,2,3,4,16) 

INSERT INTO @TEMPNEWBILLING(Billing, SuperTime) 
SELECT 
    Billing, SuperTime 
FROM 
     mClientMaint 
WHERE billing = cast(@BILLINGNUMBER as decimal) 
    AND Timestamp > @STARTITIME 
    AND Timestamp < @ENDITIME 
4

Debe usar INSERT una vez que la tabla ya está creada. Además, está utilizando una variable de tabla, por lo que debe incluir la @ al comienzo del nombre cuando se refiera a ella. Como declara la variable de tabla al inicio, ambas sentencias deberían ser realmente INSERT y no SELECT INTO.

SELECT INTO intenta crear una nueva tabla. En su código, básicamente declara una variable de tabla (que nunca se usa), luego su primer SELECT INTO crea una tabla permanente con el nombre TEMPNEWBILLING, luego su segundo SELECT INTO intenta crear una tabla con el mismo nombre exacto, de ahí el error.

9

SELECCIONAR ... INTO crea una nueva tabla.

Usted querrá revertirla:

INSERT INTO @TEMPNEWBILLING 
(Columns...) 
SELECT (your select query here) 

Usted querrá declarar la mesa (técnicamente es una variable de tabla, ya que está utilizando el signo @) como lo hizo. Luego use INSERT INTO ... SELECT ... para todas sus inserciones.

Cuestiones relacionadas