2017-12-24 10 views
0

"with"句を使用してユーザー定義の関数/ユーザー定義プロシージャを作成することは可能ですか?関数/プロシージャ内の節付きのSQL Server 2014

CREATE FUNCTION udf_UsersComments (
    @Id INT 
    ) 
RETURNS @UsersComments TABLE (
    CommentTextFormatted NVARCHAR(MAX), 
    DateCommented NVARCHAR(MAX), 
    Username NVARCHAR(255), 
    ParentCommentId INT, 
    Id INT 
    ) 
AS 
BEGIN 
WITH UpperHierarchy (Id, QuestionId, CommentText, ParentCommentId, DateCommented, UserId, HierarchyOrder, 
    lineage) 
    AS (SELECT com.Id, 
       com.QuestionId, 
       com.CommentText, 
       com.ParentCommentId, 
       com.DateCommented, 
       com.UserId, 
       0       AS HierarchyOrder, 
       Cast ('/' AS VARCHAR(255)) AS Lineage 
     FROM Comments AS com 
     WHERE com.ParentCommentId IS NULL AND IsDeleted=0 
     UNION ALL 
     (SELECT com.Id, 
       com.QuestionId, 
       com.CommentText, 
       com.ParentCommentId, 
       com.DateCommented, 
       com.UserId, 
       HierarchyOrder + 1, 
       Cast(lineage + Ltrim(Str(com.ParentCommentId, 6, 0)) 
        + '/' AS VARCHAR(255)) 
     FROM Comments AS com 
       INNER JOIN UpperHierarchy AS parent 
         ON com.ParentCommentId = parent.Id 
         WHERE com.IsDeleted=0)) 

SELECT CommentTextFormatted, DateCommented, U.Username, ParentCommentId, Com.id 
FROM Questions AS Q 
INNER JOIN 
    (SELECT Space(HierarchyOrder*5) + CommentText AS CommentTextFormatted, Id, QuestionId, ParentCommentId, DateCommented, UserId, lineage 
    FROM UpperHierarchy) AS Com 
ON Com.QuestionId=Q.Id 
INNER JOIN Users AS U 
ON U.Id=Com.UserId 
WHERE [email protected] 
ORDER BY lineage + Ltrim(Str(Q.Id, 6, 0)) 
RETURN 
END 
GO 

そして私は、このエラー

メッセージ444、レベル16、状態2、プロシージャudf_UsersComments、ライン クライアントにデータを返すことができない機能に含まれる13個の Select文を取得しています。

+0

OPは自分でテストするのが怠惰なので、この質問をオフトピックとして閉じることにしました。試してみるのが良いアイデアです。もし期待どおりに動かなければ、行動について質問してください。 – danihp

+1

はい。問題が発生している場合は、質問に試したコードを追加してください。 –

+0

@DanGuzman done – john

答えて

1

インラインテーブル値関数として作成します。私が代わりに、複数行のテーブル値関数

CREATE FUNCTION udf_UsersComments (
    @Id INT 
    ) 
RETURNS TABLE 
AS 
Return(
WITH UpperHierarchy (Id, QuestionId, CommentText, ParentCommentId, DateCommented, UserId, HierarchyOrder, 
    lineage) 
    AS (SELECT com.Id, 
       com.QuestionId, 
       com.CommentText, 
       com.ParentCommentId, 
       com.DateCommented, 
       com.UserId, 
       0       AS HierarchyOrder, 
       Cast ('/' AS VARCHAR(255)) AS Lineage 
     FROM Comments AS com 
     WHERE com.ParentCommentId IS NULL AND IsDeleted=0 
     UNION ALL 
     (SELECT com.Id, 
       com.QuestionId, 
       com.CommentText, 
       com.ParentCommentId, 
       com.DateCommented, 
       com.UserId, 
       HierarchyOrder + 1, 
       Cast(lineage + Ltrim(Str(com.ParentCommentId, 6, 0)) 
        + '/' AS VARCHAR(255)) 
     FROM Comments AS com 
       INNER JOIN UpperHierarchy AS parent 
         ON com.ParentCommentId = parent.Id 
         WHERE com.IsDeleted=0)) 

SELECT CommentTextFormatted, DateCommented, U.Username, ParentCommentId, Com.id,ordercol = lineage + Ltrim(Str(Q.Id, 6, 0)) 
FROM Questions AS Q 
INNER JOIN 
    (SELECT Space(HierarchyOrder*5) + CommentText AS CommentTextFormatted, Id, QuestionId, ParentCommentId, DateCommented, UserId, lineage 
    FROM UpperHierarchy) AS Com 
ON Com.QuestionId=Q.Id 
INNER JOIN Users AS U 
ON U.Id=Com.UserId 
WHERE [email protected]) 

ノートのインライン選んだ理由を知るために、このquestionをチェックし、私は、機能を選択しながら発注を行うために、結果に別の列を追加しました。あなたは、元の問題について

関数内 TOPなし
select CommentTextFormatted, DateCommented, Username, ParentCommentId, id 
from udf_UsersComments(1)--some id 
order by ordercol 

Order byを使用することはできません、あなたはinsert into @UsersCommentsが欠落しています。 CTE selectは、レコードを@UsersCommentsに挿入する必要があります。

+0

Msg 156、レベル15、状態1、プロシージャudf_UsersComments、行8 キーワード 'WITH'の近くに構文が正しくありません。 メッセージ319、レベル15、状態1、プロシージャudf_UsersComments、行8 'with'キーワードの構文が正しくありません。この文が共通テーブル式、xmlnamespaces句または変更追跡コンテキスト句である場合、前の文はセミコロンで終了する必要があります。 メッセージ102、レベル15、状態1、手順udf_UsersComments、行43 ')'の近くの構文が正しくありません。 メッセージ102、レベル15、状態31、手順udf_UsersComments、 'BEGIN'付近の構文が正しくありません。 – john

+0

@john - 更新を確認しました –

+0

私はまだ私の系譜の構造を保ちたい – john

関連する問題