0

私はコンマで接続されたIDを持つ文字列を返す関数を持っています。

CREATE FUNCTION [dbo].[fGetChildIdByPId] 
(
    @ID INT         
)
RETURNS VARCHAR(MAX)
AS
BEGIN 
    DECLARE @RET VARCHAR(1000)
    SET @RET = ''

    DECLARE CUR CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR 
        SELECT ID FROM tControl WHERE parentID = @ID 
    OPEN CUR

    FETCH FROM CUR INTO @ID
    WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET @RET = @RET + CAST(@ID AS VARCHAR(10)) + ',' 
        + dbo.fGetChildIdByPId(@ID) 
        FETCH NEXT FROM CUR INTO @ID
    END
    CLOSE CUR
    DEALLOCATE CUR   

    RETURN  @RET 
END

別の関数では、そのような別の選択クエリで前の関数から返された文字列を使用したい:

CREATE FUNCTION ShouldOutput
( 
    @id int,  
    @gid int
)
returns int
as
begin
     declare @out int

     if exists(SELECT * FROM tControl 
         where id in (select [dbo].[fGetChildIdByPId](@id)) 
         and summaryIndex=1 and goodId = @gid)
         set @out = 1
     else 
        set @out = 0
return @out
end

もちろん、select [dbo].fGetChildIdByPId の値を整数にキャストできず、クエリで使用できないため、問題があります。EXEC または sp_executesql を使用することを考えましたが、関数では使用できず、ストアド プロシージャでのみ使用できますが、別の SQL クエリで返された 1 または 0 の値を使用する必要があるため、関数が必要です。上記のクエリを機能させる最も簡単な方法は何ですか?

4

2 に答える 2

0

明示的な IN 関数 (一連の結果を定義する場所、つまりステート IN (1, 2)) では、動作しないコンマ区切りのリストを返す関数を渡すと、コンマ区切りのリストが使用されます。

最初の関数を次のように変更した場合

CREATE FUNCTION [dbo].[fGetChildIdByPId] 
(
    @ID INT         
)
RETURNS VARCHAR(MAX)
AS
BEGIN 
    SELECT ID, GoodId FROM tControl WHERE parentID = @ID 
END

その後、すべてが正常に動作するはずです (テストされていません)。

于 2013-10-16T12:06:58.647 に答える