7

次のコードがあります。

WITH OrderedOrders AS
(

SELECT *,  ROW_NUMBER() OVER (ORDER BY item) AS RowNumber
 from  dbo.fnSplit('1:2:3:5', ':')  
)

 select * from OrderedOrders where rownumber =2

このコードを関数内で実行する必要がありますが、構文を正しくすることはできません。現在の様子は次のとおりです。

CREATE FUNCTION [dbo].[FN_INDICE_SPLIT]
    (@sInputList VARCHAR(8000),@sDelimiter VARCHAR(8000),@INDICE INT)

RETURN TABLE 


;WITH OrderedOrders AS
( 
SELECT *,  ROW_NUMBER() OVER (ORDER BY item) AS RowNumber
 from  dbo.fnSplit(@sDelimiter, @INDICE)  
)
select ITEM from OrderedOrders where RowNumber=@INDICE

これを実行しようとすると、次のエラーが表示されます。

Msg 156, Level 15, State 1, Procedure FN_INDICE_SPLIT, Line 4
Incorrect syntax near the keyword 'RETURN'.

これをさまざまな方法で実行しようとしましたが、構文エラーが発生し続け、何が問題なのかわかりません。

4

2 に答える 2

8

TABLE-VALUED FUNCTION では、WITH の前にセミコロンは必要ありません。特に、TVF に複数ステートメントを含めることさえできないことを考えると、ステートメント区切り文字が存在する理由はありません。

正しいフォームはCREATE FUNCTION (...) RETURNS TABLE AS RETURN <statement>

CREATE FUNCTION [dbo].[FN_INDICE_SPLIT]
    (@sInputList VARCHAR(8000),@sDelimiter VARCHAR(8000),@INDICE INT)
RETURNS TABLE 
AS RETURN
WITH OrderedOrders AS
( 
SELECT *,  ROW_NUMBER() OVER (ORDER BY item) AS RowNumber
 from  dbo.fnSplit(@sDelimiter, @INDICE)  
)
select ITEM from OrderedOrders where RowNumber=@INDICE
GO
于 2012-10-31T19:22:26.480 に答える
1

RETURN* S *を使用する必要があります

RETURNS TABLE
于 2012-10-31T19:24:10.637 に答える