2010-11-18 1 views
7

Ho una funzione sql e ho bisogno di dichiarare alcune variabili in quella funzione. Si prega di avvisare come posso ottenere questo.declare la variabile in una funzione sql

Per esempio ho bisogno di mettere ->

Declare @ClientResult TABLE(
     RowIndex int identity(1,1), 
     SplitText varchar(50) 
    ) 

nella funzione qui sotto.

create FUNCTION [dbo].CLIENT_SHIPPINGREPORTDATA_Function_Test 
(     
@CLIENTPK_NEW TABLE, 
@CGNEEPK TABLE 
@type varchar(100)    
)     
RETURNS TABLE      
AS    

RETURN     

SELECT distinct    
OP_PartNum,    
OP_PK  
FROM Client_whsPallet pallet     

sto utilizzando sql server 2005

Grazie

risposta

6

che cosa siete dopo è una funzione di tavolo multi-dichiarazione

esempio

CREATE FUNCTION dbo.fxnExample (@Param INTEGER) 
RETURNS @Results TABLE(FieldA VARCHAR(50)) 
AS 
BEGIN 
INSERT @Results 
SELECT SomeField 
FROM Somewhere 
WHERE ParamField = @Param 

RETURN 
END 

Questo è diverso per la funzione corrente che viene chiamato un "tavolo funzione a valori in linea" e si dovrebbe essere consapevoli delle differenze in quanto ciò potrebbe causare problemi di prestazioni se si passa a un approccio multi-dichiarazione. Il mio consiglio sarebbe quello di provare e utilizzare le funzioni di valore in linea ogni volta che è possibile. Vi consiglio di check-out questi articoli, che vanno in dettaglio:

Multi-statement Table Valued Function vs Inline Table Valued Function
http://blogs.msdn.com/b/psssql/archive/2010/10/28/query-performance-and-multi-statement-table-valued-functions.aspx
http://sqlbits.com/Agenda/event6/High_performance_functions/default.aspx

+0

Cosa succede se i valori della mia tabella restituita sono in realtà una tabella pivot basata su colonne dinamiche? Ecco perché sto usando una funzione tabella ...: / –

5

In SQL Server non è possibile dichiarare le variabili all'interno di una funzione con valori di tabella in linea. Dovrai creare una funzione con valori di tabelle a più istruzioni se hai davvero bisogno di dichiarare le variabili al suo interno. Si potrebbe fare qualcosa di simile:

CREATE FUNCTION [dbo].CLIENT_SHIPPINGREPORTDATA_Function_Test 
(
    @CLIENTPK_NEW TABLE, @CGNEEPK TABLE @type varchar(100) 
) 
RETURNS @output TABLE (OP_PartNum int, OP_PK int) 
AS BEGIN 

Declare @ClientResult TABLE(RowIndex int identity(1,1), SplitText varchar(50)) 

/* more code here */ 

RETURN 
END 

non sapendo che cosa esattamente è che si sta tentando di fare, vorrei vedere se c'è via intorno utilizzando una funzione multi-dichiarazione anche se, come si vedrà riduzione delle prestazioni.

0

Come suggerito da AdaTheDev è possibile creare una funzione di multiistruzione per restituire una tabella da una funzione.
In caso contrario, se è necessario creare una tabella all'interno della funzione è possibile creare una nuova tabella temporanea prefisso il suo nome con un #

create table #TableNAme (FieldA Varchar(5)) 
3

confrontare questi esempi di codice equivalenti. Mostrano le differenze di sintassi tra le funzioni con valori di tabella inline e multistatement.

CREATE FUNCTION [dbo].Inline (@type varchar(100)) 
RETURNS TABLE 
AS 
RETURN 
    SELECT distinct name 
    FROM sysobjects 
    WHERE type = @type 
GO 

CREATE FUNCTION [dbo].Multistatement (@type varchar(100)) 
RETURNS @results TABLE (name sysname) 
AS 
BEGIN 
    INSERT @results (name) 
    SELECT distinct name 
    FROM sysobjects 
    WHERE type = @type 

    RETURN 
END