объявить переменную в функции 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))