2010-11-18 69 views
7

Tôi có hàm sql và tôi cần khai báo vài biến trong hàm đó. Xin vui lòng tư vấn làm thế nào tôi có thể đạt được điều này.khai báo biến trong hàm sql

Ví dụ tôi cần phải đặt ->

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

trong hàm dưới.

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     

Tôi đang sử dụng SQL Server 2005

Cảm ơn

Trả lời

6

gì bạn đang sau là một hàm bảng đa tuyên bố

ví dụ

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 

này khác với chức năng hiện tại của bạn được gọi là một "bảng giá trị chức năng inline" và bạn cần phải nhận thức sự khác biệt như thế này có thể gây ra vấn đề hiệu suất nếu bạn chuyển sang cách tiếp cận đa tuyên bố. Lời khuyên của tôi sẽ là thử và sử dụng các hàm nội tuyến có giá trị khi có thể. Tôi khuyên bạn nên kiểm tra ra những bài viết này mà đi vào chi tiết:

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

Điều gì sẽ xảy ra nếu giá trị của bảng được trả về của tôi thực tế là bảng tổng hợp dựa trên cột động? Thats trong thực tế, tại sao tôi đang sử dụng một chức năng bảng ...: / –

5

Trong SQL Server bạn không thể khai báo các biến bên trong một hàm bảng-Valued inline. Bạn sẽ cần phải tạo ra một bảng đa tuyên bố có giá trị chức năng nếu bạn thực sự cần phải khai báo các biến trong nó. Bạn sẽ làm một cái gì đó như thế này:

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 

Không biết chính xác bạn đang cố gắng làm gì, tôi sẽ thấy nếu có xung quanh bằng cách sử dụng hàm đa tuyên bố mặc dù bạn sẽ thấy hiệu suất giảm.

0

Theo đề xuất của AdaTheDev, bạn có thể tạo hàm đa câu lệnh để trả về bảng từ hàm.
Nếu không nếu bạn cần để tạo ra một bảng bên trong hàm bạn có thể tạo một bảng tạm thời mới đặt trước từ tên của nó với #

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

So sánh các mẫu mã tương đương. Chúng cho thấy sự khác biệt cú pháp giữa các hàm bảng có giá trị nội dòng và đa tầng.

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 
Các vấn đề liên quan