объявить переменную в функции SQL

у меня есть функция в SQL и мне нужно объявить несколько переменных в этой функции. Пожалуйста, посоветуйте, как этого достичь.

например мне нужно поставить -->

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

в функции ниже.

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                 

Я использую sql server 2005

спасибо

4 ответов


что вы после нескольких инструкций табличную функцию

например

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

это отличается от вашей текущей функции, которая называется "встроенной табличной функцией", и вы должны знать о различиях, поскольку это может вызвать проблемы с производительностью, если вы переключитесь на подход с несколькими операторами. Мой совет состоял бы в том, чтобы попытаться использовать встроенные функции с табличным значением, где это возможно. Я рекомендую вам проверить эти статьи, которые идут в деталь:

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


в SQL Server нельзя объявлять переменные внутри встроенной табличной функции. Вам нужно будет создать функцию с несколькими операторами, если вам действительно нужно объявить переменные в ней. Вы бы сделали что-то вроде этого:

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

Не зная, что именно вы пытаетесь сделать, я бы посмотрел, есть ли вокруг с помощью функции multi-statement, хотя, как вы увидите, производительность снижается.


сравните эти эквивалентные примеры кода. Они показывают синтаксические различия между встроенными и многозначными табличными функциями.

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

как предложил AdaTheDev, вы можете создать функцию с несколькими операторами для возврата таблицы из функции.
В противном случае, если вам нужно создать таблицу внутри функции, вы можете создать новую временную таблицу с префиксом ее имени #

create table #TableNAme (FieldA Varchar(5))