No puede tener acceso a las tablas temporales desde dentro de una función

Me gustaría obtener el número de registros específicos. Así que mi consulta se verá como la siguiente…

SELECT
    ID, 
    NAME,
    (SELECT...) AS UserCount // Stmt1
FROM MyTable

El problema es que, ‘Stmt1’ es una instrucción compleja y no puede ser escrito como innerquery.
Bueno, puedo utilizar las funciones, pero la declaración incluye «CREAR TABLA» así me sale el siguiente mensaje de error

Cannot access temporary tables from within a function.

¿Cuál es la mejor forma para realizar la tarea ?

InformationsquelleAutor Rauf | 2012-03-05

4 Kommentare

  1. 24

    Se puede utilizar el tipo de tabla definido para resolver su problema.

    Usted acaba de crear una variable de tabla como

    CREATE TYPE [dbo].[yourTypeName] AS TABLE(
        [columeName1] [int] NULL,
        [columeName2] [varchar](500) NULL,
        [columeName3] [varchar](1000) NULL
    )
    GO

    y puede declarar esta variable de tabla en su función como

        CREATE FUNCTION [dbo].[yourFunctionName] 
    ( 
        @fnVariable1 INT ,
        @yourTypeNameVariable yourTypeName READONLY
    ) 
    RETURNS VARCHAR(8000) 
    AS 
    BEGIN 
    
        SELECT .................
            FROM @yourTypeNameVariable 
            WHERE ........
        RETURN @r 
    END 

    De su procedimiento, usted puede declarar su tipo de tabla como

    DECLARE @yourTypeNamevaribale AS yourTypeName 

    Y se puede insertar valores de esta tabla como

    insert into @yourTypeNamevaribale (col,col,..)values(val,val,..)

    pasar esto a su función como

    dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale )

    por favor ir a este método, gracias

  2. 3

    Sí no se puede utilizar la tabla #temp.

    Como usted está utilizando SQL Server 2008, ¿por qué no utilice la tabla de la variable en lugar de #tablas temporales?
    Darle una oportunidad.

    • Uso convenido Declare @TempTable como TABLA ( elementid int elemento) VARCHAR(8000) ) en lugar de la #mesa
  3. 1

    Me encontré con este post, como he empezado a usar la tabla de variables y pasó a tablas temporales por motivos de rendimiento, sólo para encontrar las tablas temporales no se podía utilizar en una función.

    Yo estaría indeciso sobre el uso de la tabla de variables, especialmente si usted está jugando con conjuntos de resultados grandes, ya que estos se mantienen en la memoria. Ver este post…

    http://totogamboa.com/2010/12/03/speed-matters-subquery-vs-table-variable-vs-temporary-table/

    Otras alternativas podría ser..

    1. La extracción de la tabla temporal resultado en otra tabla de la función.
    2. Convertir el código en el uso de sub-consultas
  4. 0

    En el 99,99% de los casos no hay necesidad de cualquier de los trucos con tablas temporales o subconsultas, pero el uso de funciones de agregación como COUNT, SUM o AVG en combinación con SOBRE cláusula y (a menudo) PARTITION BY.

    No estoy seguro de lo que el OP trató de lograr, pero supongo que el UserCount está de alguna manera relacionado con los valores en MyTable. Así que debe haber una manera para unirse a MyTable a cualquier tabla en la que se produce UserCount.

    La mayoría simple ejemplo es mostrar a todos los usuarios y el número total de usuarios

    SELECT id
        , name
        , user_count = COUNT(*) OVER()
    FROM MyUsers

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea