0

nvarchar(MAX)文字列を返すSQL関数を作成しようとしています。この関数は、CTE再帰WITHステートメントを使用します。関数に含まれていない場合はすべてのパーツを正しく機能させることができますが、すべてをまとめると次のエラーが発生します。

メッセージ208、レベル16、状態1、行1無効なオブジェクト名'drillUp'。

関数自体は、「コンパイル」中にエラーを発生させませんが、実行された場合にのみエラーを発生させます。SELECTステートメントを呼び出す代わりにSET@RETを"TESTING..."に変更すると、期待どおりに実行されます。

私はSQLにかなり慣れていないので、何が間違っているのかわかりません。誰かが私にいくつかのアドバイスを与えることができれば、私はそれを大いに感謝します。

ありがとうございました。

ジョー

CREATE FUNCTION BuildName(@SUBTRAIT_ID int)
RETURNS nvarchar(MAX)
AS
BEGIN
DECLARE @RET nvarchar(MAX)
DECLARE @TEXTMODE nvarchar(50)
DECLARE @PARENTID int
DECLARE @CHECKDROPDOWN TABLE
(
    TextMode nvarchar(MAX),
    ParentId int
);

WITH drillUp(FullName, ParentId, depth) 
AS
(
    SELECT  
        SubValue,
        ParentId,
        0           
    FROM SubTrait
    WHERE Id = @SUBTRAIT_ID 
    UNION ALL
    SELECT                  
        child.SubValue + ' -> ' + drillUp.FullName,
        child.ParentId,
        drillUp.depth + 1
    FROM SubTrait child, drillUp
    WHERE drillUp.ParentId = child.Id 
)


INSERT @CHECKDROPDOWN 
SELECT TextMode, ParentId FROM SubTrait WHERE Id = @SUBTRAIT_ID

SET @TEXTMODE = (SELECT MAX(TextMode) FROM @CHECKDROPDOWN);
SET @PARENTID = (SELECT MAX(ParentId) FROM @CHECKDROPDOWN);

IF (@TEXTMODE != 'DropDown')
BEGIN
    SET @SUBTRAIT_ID = @PARENTID
END 

SET @RET = (
       SELECT FullName
       FROM drillUp du
       WHERE depth =(SELECT MAX(depth) FROM drillUp ) - 1
     )
--  SET @RET = 'TESTING...'

RETURN (@RET)

END;
GO


PRINT dbo.BuildName(77)
4

1 に答える 1

1

CTEは、彼の定義に続くステートメントでのみ使用できます。SET @RETしたがって、次の定義に移動する必要がありますdrillup

CREATE FUNCTION BuildName(@SUBTRAIT_ID int)
RETURNS nvarchar(MAX)
AS
BEGIN
DECLARE @RET nvarchar(MAX)
DECLARE @TEXTMODE nvarchar(50)
DECLARE @PARENTID int
DECLARE @CHECKDROPDOWN TABLE
(
    TextMode nvarchar(MAX),
    ParentId int
);

INSERT @CHECKDROPDOWN 
SELECT TextMode, ParentId FROM SubTrait WHERE Id = 74

SET @TEXTMODE = (SELECT MAX(TextMode) FROM @CHECKDROPDOWN);
SET @PARENTID = (SELECT MAX(ParentId) FROM @CHECKDROPDOWN);

IF (@TEXTMODE != 'DropDown')
BEGIN
    SET @SUBTRAIT_ID = @PARENTID
END 

WITH drillUp(FullName, ParentId, depth) 
AS
(
    SELECT  
        SubValue,
        ParentId,
        0           
    FROM SubTrait
    WHERE Id = @SUBTRAIT_ID 
    UNION ALL
    SELECT                  
        child.SubValue + ' -> ' + drillUp.FullName,
        child.ParentId,
        drillUp.depth + 1
    FROM SubTrait child, drillUp
    WHERE drillUp.ParentId = child.Id 
)
SELECT @RET = (
       SELECT FullName
       FROM drillUp du
       WHERE depth =(SELECT MAX(depth) FROM drillUp ) - 1
     )
--  SET @RET = 'TESTING...'


RETURN (@RET)

END;
GO


PRINT dbo.BuildName(77)
于 2012-06-14T16:28:46.213 に答える