locked
Ejecutar un sp con tablas temporales desde Reporting Service RRS feed

  • Pregunta

  •  

    Hola, estoy intentando ejecutar un sp desde Reporting Service, el cual contiene tablas temporales y se produce el sig error:
     
    Error en la consulta. El nombre de objeto '#ttemp' no es válido.
     
     
    Gracias.
    miércoles, 9 de abril de 2008 12:55

Respuestas

  • - Que version de SSRS usas?
    - Crees que puedas postear el codigo del procedimiento?

    La forma en Reporting Services captura información sobre la metadata del resultado, es ejecutando el procedimiento con la opcion "set fmtonly on". Esta opcion retorna información sobre la metadata del resultado sin ejecutar el procedimiento. Como la tabla no existe sin ejecutar el procedimiento, entonces no se puede obtener la metadata.

    Veamos un ejemplo para reproducir el error.

    USE Northwind;
    GO
    CREATE PROCEDURE dbo.p1
    AS
    SET NOCOUNT ON;
    
    DECLARE @i int;
    
    SET @i = 1;
    
    IF @i = 1
        CREATE TABLE #T (c1 int);
    
    SELECT c1 FROM #T;
    GO
    SET FMTONLY ON;
    GO
    EXEC dbo.p1;
    SET FMTONLY OFF;
    GO
    DROP PROCEDURE dbo.p1;
    GO
    
    Result:
    
    Msg 208, Level 16, State 0, Procedure p1, Line 12
    Invalid object name '#T'.

    Si el procedimiento no demora mucho y no cambia el estado de la base de datos (no insert / update / delete en las tablas permanentes), entonces pudieras usar "set fmtonly off" dentro del procedimiento. Estate seguro del riesgo que corres.


    USE Northwind;
    GO
    CREATE PROCEDURE dbo.p1
    AS
    SET NOCOUNT ON;
    
    SET FMTONLY OFF;
    
    DECLARE @i int;
    
    SET @i = 1;
    
    IF @i = 1
        CREATE TABLE #T (c1 int);
    
    SELECT c1 FROM #T;
    GO
    SET FMTONLY ON;
    GO
    EXEC dbo.p1;
    SET FMTONLY OFF;
    GO
    DROP PROCEDURE dbo.p1;
    GO
    
    Result:
    
    c1
    -------

    Este metodo, aunque funciona, no me parece muy prudente.

    Otra cosa que puedes hacer es crear el Dataset manualmente.

    Cómo agregar, editar o eliminar un campo en la ventana Conjuntos de datos (Diseñador de informes)
    http://technet.microsoft.com/es-es/library/ms156295(SQL.90).aspx


    AMB
    martes, 24 de noviembre de 2009 0:48

Todas las respuestas

  • Hola Petra2,

     

    ¿Has probado a utilizar un SP por separadao para ver si funciona?  Yo he probado tablas temporales desde y procedimientos almacenados y funcionan, nunca utilicé esa opción. También puede ser que no se haya borrado la tabla aún y te de ese error.

     

    Bueno, ya nos contarás que tal.

     

    Un Saludo

     

    miércoles, 9 de abril de 2008 13:32
    Moderador
  • Hola, te comento que el SP si lo ejecuto desde una ventana de consulta funciona correctamente. Es mas tengo otros SP pero sin tablas temporales en ellos y funcionan bien.

    El problema lo estoy teniendo cuando intento crear un nuevo informe en Reporting service. No se por que no me reconoce la tabla temporal que se crea en el SP.

     

    Espero haber sido un poco mas claro.

     

    Saludos y gracias.

    miércoles, 9 de abril de 2008 14:08
  • Debes cambiar las tablas temporales por variables del tipo tabla, cuando termines con el asistente donde te da el problema, si deseas, puedes volver a dejar tu SP como estaba antes con las tablas temporales.

    Saludos.
    lunes, 23 de noviembre de 2009 22:07
  • - Que version de SSRS usas?
    - Crees que puedas postear el codigo del procedimiento?

    La forma en Reporting Services captura información sobre la metadata del resultado, es ejecutando el procedimiento con la opcion "set fmtonly on". Esta opcion retorna información sobre la metadata del resultado sin ejecutar el procedimiento. Como la tabla no existe sin ejecutar el procedimiento, entonces no se puede obtener la metadata.

    Veamos un ejemplo para reproducir el error.

    USE Northwind;
    GO
    CREATE PROCEDURE dbo.p1
    AS
    SET NOCOUNT ON;
    
    DECLARE @i int;
    
    SET @i = 1;
    
    IF @i = 1
        CREATE TABLE #T (c1 int);
    
    SELECT c1 FROM #T;
    GO
    SET FMTONLY ON;
    GO
    EXEC dbo.p1;
    SET FMTONLY OFF;
    GO
    DROP PROCEDURE dbo.p1;
    GO
    
    Result:
    
    Msg 208, Level 16, State 0, Procedure p1, Line 12
    Invalid object name '#T'.

    Si el procedimiento no demora mucho y no cambia el estado de la base de datos (no insert / update / delete en las tablas permanentes), entonces pudieras usar "set fmtonly off" dentro del procedimiento. Estate seguro del riesgo que corres.


    USE Northwind;
    GO
    CREATE PROCEDURE dbo.p1
    AS
    SET NOCOUNT ON;
    
    SET FMTONLY OFF;
    
    DECLARE @i int;
    
    SET @i = 1;
    
    IF @i = 1
        CREATE TABLE #T (c1 int);
    
    SELECT c1 FROM #T;
    GO
    SET FMTONLY ON;
    GO
    EXEC dbo.p1;
    SET FMTONLY OFF;
    GO
    DROP PROCEDURE dbo.p1;
    GO
    
    Result:
    
    c1
    -------

    Este metodo, aunque funciona, no me parece muy prudente.

    Otra cosa que puedes hacer es crear el Dataset manualmente.

    Cómo agregar, editar o eliminar un campo en la ventana Conjuntos de datos (Diseñador de informes)
    http://technet.microsoft.com/es-es/library/ms156295(SQL.90).aspx


    AMB
    martes, 24 de noviembre de 2009 0:48
  • Hola.

    Lo que yo haría sería reescribir el procedimiento almacenado para que no use tablas temporales, porque el motivo del error es ese que comenta Alejandro. No sé cómo de complicado será, pero seguro que puede conseguirse. Si quieres, puedes pasarnos el código y te podemos echar una mano con ello.


    Alberto López Grande (Visita mi blog en http://qwalgrande.blogspot.es/)
    martes, 24 de noviembre de 2009 8:29
    Moderador
  • - Que version de SSRS usas?
    - Crees que puedas postear el codigo del procedimiento?

    La forma en Reporting Services captura información sobre la metadata del resultado, es ejecutando el procedimiento con la opcion "set fmtonly on". Esta opcion retorna información sobre la metadata del resultado sin ejecutar el procedimiento. Como la tabla no existe sin ejecutar el procedimiento, entonces no se puede obtener la metadata.

    Veamos un ejemplo para reproducir el error.

    USE Northwind;
    
    GO
    
    CREATE PROCEDURE dbo.p1
    
    AS
    
    SET NOCOUNT ON;
    
    
    
    DECLARE @i int;
    
    
    
    SET @i = 1;
    
    
    
    IF @i = 1
    
        CREATE TABLE #T (c1 int);
    
    
    
    SELECT c1 FROM #T;
    
    GO
    
    SET FMTONLY ON;
    
    GO
    
    EXEC dbo.p1;
    
    SET FMTONLY OFF;
    
    GO
    
    DROP PROCEDURE dbo.p1;
    
    GO
    
    
    
    Result:
    
    
    
    Msg 208, Level 16, State 0, Procedure p1, Line 12
    
    Invalid object name '#T'.
    
    

    Si el procedimiento no demora mucho y no cambia el estado de la base de datos (no insert / update / delete en las tablas permanentes), entonces pudieras usar "set fmtonly off" dentro del procedimiento. Estate seguro del riesgo que corres.


    USE Northwind;
    
    GO
    
    CREATE PROCEDURE dbo.p1
    
    AS
    
    SET NOCOUNT ON;
    
    
    
    SET FMTONLY OFF;
    
    
    
    DECLARE @i int;
    
    
    
    SET @i = 1;
    
    
    
    IF @i = 1
    
        CREATE TABLE #T (c1 int);
    
    
    
    SELECT c1 FROM #T;
    
    GO
    
    SET FMTONLY ON;
    
    GO
    
    EXEC dbo.p1;
    
    SET FMTONLY OFF;
    
    GO
    
    DROP PROCEDURE dbo.p1;
    
    GO
    
    
    
    Result:
    
    
    
    c1
    
    -------
    
    

    Este metodo, aunque funciona, no me parece muy prudente.

    Otra cosa que puedes hacer es crear el Dataset manualmente.

    Cómo agregar, editar o eliminar un campo en la ventana Conjuntos de datos (Diseñador de informes)
    http://technet.microsoft.com/es-es/library/ms156295(SQL.90).aspx


    AMB

    También esta es otra opción, hazlo en el asistente del SSRS.

    De esta forma.

    http://img230.imageshack.us/img230/9757/problemaconssrsyspconta.jpg

    Saludos.

    martes, 24 de noviembre de 2009 14:59