объявить переменную в функции sql - PullRequest
7 голосов
/ 18 ноября 2010

У меня есть функция 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 ]

6 голосов
/ 18 ноября 2010

Что вам нужно, так это табличная функция с несколькими операторами

, например

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

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

Функция таблицы с несколькими утверждениями против функции с таблицей Inline
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

5 голосов
/ 18 ноября 2010

В 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

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

3 голосов
/ 18 ноября 2010

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

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
0 голосов
/ 18 ноября 2010

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

create table #TableNAme (FieldA Varchar(5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...