2010-11-18 9 views
7

Ich habe eine SQL-Funktion und ich muss einige Variablen in dieser Funktion deklarieren. Bitte beraten Sie, wie ich das erreichen kann.deklarieren Variable in einer SQL-Funktion

Zum Beispiel muss ich setzen ->

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

in der unten Funktion.

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     

Ich bin mit SQL Server 2005

Dank

Antwort

6

Was sind Sie nach ist eine Multi-Anweisung Tabellenfunktion

z.B.

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 

Dies unterscheidet sich von Ihrer aktuellen Funktion, die eine „Inline-Tabellenwertfunktion“ genannt wird, und Sie sollten die Unterschiede bewusst sein, da dies zu Leistungsproblemen führen könnte, wenn Sie in die Multi-Statement Ansatz wechseln. Mein Rat wäre, wenn möglich, Inline-Tabellenwerte zu verwenden. Ich empfehle Sie diese Artikel heraus überprüfen, die ins Detail gehen:

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

Was passiert, wenn die Werte meiner zurückgegebenen Tabelle tatsächlich eine Pivot-Tabelle sind, die auf dynamischen Spalten basiert? Das ist in der Tat, warum ich eine Tabellenfunktion verwende ...: / –

5

In SQL Server nicht Variablen innerhalb einer Inline-Tabellenfunktion deklarieren können. Sie müssen eine Tabellenfunktion mit mehreren Anweisungen erstellen, wenn Sie wirklich Variablen darin deklarieren müssen. Sie würde so etwas tun:

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 

Nicht zu wissen, was genau es ist, dass Sie versuchen zu tun, würde ich sehen, ob es allerdings weg eine Funktion mit mehreren Anweisungen um mit, wie Sie Leistungsabfall sehen.

0

Wie von AdaTheDev vorgeschlagen, können Sie eine Multi-Statement-Funktion zum Zurückgeben einer Tabelle aus einer Funktion erstellen.
Andernfalls, wenn Sie eine Tabelle in der Funktion erstellen Sie eine neue temporäre Tabelle mit einem # ihren Namen

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

diese äquivalenten Codebeispiele vergleichen prefixing erstellen können. Sie zeigen die Syntaxunterschiede zwischen Inline- und Multistatement-Tabellenwertfunktionen.

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 
Verwandte Themen