2010-11-18 66 views
7

Tengo una función SQL y necesito declarar algunas variables en esa función. Por favor asesórese sobre cómo puedo lograr esto.declarar variable en una función sql

Por ejemplo tengo que poner ->

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

en la función a continuación.

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     

estoy usando SQL Server 2005

Gracias

Respuesta

6

lo que está después es una función de tabla de múltiples instrucciones

por ejemplo,

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 

Esto es diferente a su función actual, que se denomina "valores de tabla de función en línea" y que debe estar al tanto de las diferencias ya que esto podría causar problemas de rendimiento si se cambia el enfoque de múltiples instrucciones. Mi consejo sería tratar de usar funciones valiosas de la tabla en línea siempre que sea posible. Te recomiendo que retirar estos artículos que entran en detalle:

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

¿Qué ocurre si los valores de la tabla devuelta son en realidad una tabla dinámica basada en columnas dinámicas? De hecho, es por eso que estoy usando una función de tabla ...: / –

5

En SQL Server no se puede declarar variables en el interior de una función con valores de tabla en línea. Tendrá que crear una función valorada de tabla de declaraciones múltiples si realmente necesita declarar variables en ella. Se podría hacer algo como esto:

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 

sin saber exactamente qué es lo que están tratando de hacer, me gustaría ver si hay distancia alrededor de usar una función de varias instrucciones, aunque como se verá disminución del rendimiento.

0

Según lo sugerido por AdaTheDev, puede crear una función de instrucciones múltiples para devolver una tabla de una función.
De lo contrario, si es necesario crear una tabla dentro de la función se puede crear una nueva tabla temporal como prefijo al nombre de un #

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

comparar estos ejemplos de código equivalentes. Muestran las diferencias de sintaxis entre las funciones con valores de tabla en línea y multiestaciones.

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 
Cuestiones relacionadas