2010-11-18 37 views
7

Bir sql işlevim var ve bu işlevin birkaç değişkenini bildirmem gerekiyor. Lütfen bunu nasıl başarabileceğimi bildiriniz. >sql işlevinde değişken bildirme

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

aşağıda işlevinde -

Örneğin ben koymak gerekir.

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     

ben sql sunucusunu bir çok deyim tablo işlevini 2005

Teşekkür

cevap

6

Ne peşinde olduğunu kullanıyorum

örn

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 

Bu bir "inline tablo değerli işlev" denir ve çoklu tablo yaklaşımına geçerseniz bu performans sorunlarına neden olabilir gibi farklılıkların farkında olmalıdır geçerli fonksiyona farklıdır. Benim tavsiyem, mümkün olan yerlerde satır içi tablo değerli fonksiyonlarını kullanmak ve kullanmak olacaktır. Sana detaya bu makalelere göz atmanızı öneririz: SQL Server

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

Döndürülmüş tablonun değerleri aslında dinamik sütunlara dayalı bir pivot tablo ise ne olur? Bu yüzden aslında bir Table Function kullanıyorum ...: / –

5

Bir satır içi tablo Değerli işlev içinde değişkenleri bildirmek olamaz. Değişkenleri gerçekten bildirmeniz gerekiyorsa, çoklu tablolama değerli bir işlev oluşturmanız gerekir. Böyle bir şey yapacağını:

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 

tam olarak uzakta performans düşüşü göreceğiniz gibi olsa çok deyim işlevini kullanarak etrafında varsa ben görecekti yapmaya çalışıyorsun ne olduğunu bilmeden.

0

AdaTheDev tarafından önerildiği gibi, bir tablonun bir işlevden döndürülmesi için çok deyimli bir işlev oluşturabilirsiniz.
Aksi takdirde sen

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

bu eşdeğer kod örnekleri karşılaştırın bir # ile adını önek yeni bir geçici tablo oluşturabilirsiniz fonksiyon içerisinde bir tablo oluşturmak için gerekiyorsa. Satır içi ve çok aşamalı tablo değerli işlevler arasındaki sözdizimi farklılıklarını gösterir.

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 
İlgili konular