SQL use函数在select where in(..)查询中返回字符串
我有一个函数,它返回一个id用逗号连接的字符串,类似于:SQL use函数在select where in(..)查询中返回字符串,sql,sql-server,select,Sql,Sql Server,Select,我有一个函数,它返回一个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 I
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查询中使用上一个函数返回的字符串,如下所示:
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值。使上述查询工作的最简单方法是什么?在显式in函数中(在函数中定义一组结果,即(1,2)中的状态),如果您将返回逗号分隔列表的函数传递给它,则会使用逗号分隔列表 如果将第一个函数改为
CREATE FUNCTION [dbo].[fGetChildIdByPId]
(
@ID INT
)
RETURNS VARCHAR(MAX)
AS
BEGIN
SELECT ID, GoodId FROM tControl WHERE parentID = @ID
END
然后一切都会正常工作(未经测试)。你不应该这样做
第二个函数应该采用表值参数,其中该参数是希望在函数中使用的值表,而不是串联字符串
为此,您的第一个函数应该返回一个值表,而不是字符串。也许您应该告诉我们您要做什么。。。用简单的英语说,值得一提的是,TVP只在SQL Server 2008以后才可用。@podiluska,谢谢,这正是我需要的)