2012-03-05 17 views
11

Me gustaría obtener el recuento de registros específicos. Así que mi pregunta se verá como la siguiente ...No se puede acceder a tablas temporales desde una función

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

La cuestión es que, 'instr1' es una declaración compleja y no se puede escribir como innerquery. Bueno, puedo utilizar las funciones, pero la declaración incluye 'CREATE TABLE' por lo que me sale el siguiente mensaje de error

Cannot access temporary tables from within a function.

¿Cuál es la mejor manera de cumplir con la tarea?

Respuesta

18

Puede usar el tipo de tabla definido por el usuario 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 se puede declarar esta variable 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 

En el procedimiento se puede declarar el tipo de tabla como

DECLARE @yourTypeNamevaribale AS yourTypeName 

Y puede insertar valores en esta tabla como

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

pase esto a su función como

dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale) 

por favor vaya a este método, gracias

2

Sí, no puede usar la tabla #temp.

Como está utilizando SQL Server 2008, ¿por qué no usa la variable de tabla en lugar de las tablas #temp? Pruébalo.

+0

acordado utilizar el @TempTable declarar como TABLA mostrar (int elementID, elemento VARCHAR (8000) ) en lugar de #table –

1

me encontré con este post que he empezado a utilizar las variables de tabla y se cambió a las tablas temporales por motivos de rendimiento solo para encontrar tablas temporales no se podría utilizar en una función.

Yo dudaría sobre el uso de variables de tabla, especialmente si está jugando con grandes conjuntos de resultados, ya que se guardan en la memoria. Ver este post ... serían

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

Otras alternativas ..

  1. Extraer el resultado tabla temporal en otra función de tabla.
  2. Convertir el código en
  3. mediante subconsultas
+0

las variables de tabla no se almacenan "solo en la memoria": http://sqlserverplanet.com/tsql/yet-another-temp-tables-vs-table-variables-article –

0

En 99,99% de los casos no hay necesidad de ningún tipo de trucos con tablas temporales o sub consultas, pero el uso de agregación funciones como COUNT, SUM o en combinación con AVGOVER clause y (a menudo) PARTITION BY.

No estoy seguro de lo que el OP intentó lograr, pero supongo que el UserCount está relacionado de alguna manera con los valores en MyTable. Entonces debe haber una manera de unir MyTable a cualquier tabla que produzca UserCount.

El ejemplo más simple es a todos los usuarios y el número total de usuarios

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