我有一个函数返回一个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值。使提到的查询有效的最简单方法是什么?
答案 0 :(得分:1)
你不应该。
你的第二个函数应该采用一个表值参数 - 其中该参数是你希望在函数中使用的值表 - 而不是一个连接的字符串。
为此,您的第一个函数应返回值表,而不是字符串。
答案 1 :(得分: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
然后一切都应该正常(未经测试)。