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

1

你不应该。

您的第二个函数应该采用表值参数 - 其中该参数是您希望在函数中使用的值表 - 而不是连接字符串。

为此,您的第一个函数应该返回一个值表,而不是一个字符串。

于 2013-10-16T12:13:25.483 回答
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 回答