2012-03-05 32 views
11

vorrei ottenere conteggio di record specifici. Quindi la mia domanda sarà simile al seguente ...Impossibile accedere tabelle temporanee all'interno di una funzione

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

Il problema è che, 'stmt1' è una dichiarazione complessa e non può essere scritto come innerquery. Beh, posso utilizzare le funzioni, ma la dichiarazione include 'CREATE TABLE' in modo da ottenere il seguente messaggio di errore

Cannot access temporary tables from within a function.

Qual è il modo migliore per realizzare il compito?

risposta

18

È possibile utilizzare definito dall'utente tipo di tabella per risolvere il problema.

basta creare una variabile di tabella come

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

ed è possibile dichiarare questa variabile tabella nel funzione come

CREATE FUNCTION [dbo].[yourFunctionName] 
( 
    @fnVariable1 INT , 
    @yourTypeNameVariable yourTypeName READONLY 
) 
RETURNS VARCHAR(8000) 
AS 
BEGIN 

    SELECT ................. 
     FROM @yourTypeNameVariable 
     WHERE ........ 
    RETURN @r 
END 

Sulla procedura è possibile dichiarare il tipo di tavolo come

DECLARE @yourTypeNamevaribale AS yourTypeName 

E si può inserire i valori di questa tabella come

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

passaggio questo alla vostra funzione come

dbo.yourFunctionName(fnVariable1 ,@yourTypeNamevaribale) 

si prega di andare per questo metodo, grazie

2

Sì, non è possibile utilizzare #temp tavolo.

Come si utilizza SQL Server 2008, perché non si utilizza variabile di tabella invece delle tabelle #temp? Fai un tentativo.

+0

utilizzo concordato la @TempTable dichiarare come TABELLA ( elementID int, elemento VARCHAR (8000) ) anziché #table –

1

mi sono imbattuto in questo post come ho iniziato ad usare le variabili di tabella e passato a tabelle temporanee per motivi di prestazioni solo per trovare tabelle temporanee non possono essere utilizzate in una funzione.

sarei titubante sull'utilizzo di variabili di tabella, soprattutto se si sta giocando con grandi set di risultati, in quanto questi sono tenuti in memoria. Vedi questo post ...

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

Altre alternative sarebbero ..

  1. Estrazione del risultato tabella temporanea in un'altra funzione di tabella.
  2. Conversione del codice in utilizzando sottoquery
+0

le variabili di tabella non vengono memorizzate "solo in memoria": http://sqlserverplanet.com/tsql/yet-another-temp-tables-vs-table-variables-article –

0

Nel 99,99% dei casi non v'è alcuna necessità di trucchi con tabelle temporanee o subquery, ma l'uso di aggregazione funzioni come COUNT, SUM o AVG in combinazione con OVER clause e (spesso) PARTITION BY.

Non sono sicuro di ciò che l'OP ha tentato di ottenere ma presumo che UserCount sia in qualche modo correlato ai valori in MyTable. Quindi ci deve essere un modo per unire MyTable a qualsiasi tabella che produce UserCount.

L'esempio più semplice è quello di mostrare tutti gli utenti e il numero totale di utenti

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