Sql server 如何迭代CTE结果
上述查询在我的存储过程中运行良好。但它将返回许多行,因此我想迭代所有行,并使用Sql server 如何迭代CTE结果,sql-server,sql-server-2014,Sql Server,Sql Server 2014,上述查询在我的存储过程中运行良好。但它将返回许多行,因此我想迭代所有行,并使用MemberGroupID调用另一个存储过程 如何执行此操作?根据请求,但不知道您的SP做了什么/返回了什么: 将交叉申请视为一个子程序 示例1: WITH cte AS ( SELECT MemberGroupID FROM [dbo].[RoleMembers] WITH(NOLOCK) WHERE RoleDefID = 1 ) SELECT * FROM cte 示例2: 下面将按
MemberGroupID
调用另一个存储过程
如何执行此操作?根据请求,但不知道您的SP做了什么/返回了什么: 将交叉申请视为一个子程序 示例1:
WITH cte AS
(
SELECT MemberGroupID
FROM [dbo].[RoleMembers] WITH(NOLOCK)
WHERE RoleDefID = 1
)
SELECT * FROM cte
示例2:
下面将按ID拆分并取消分隔字符串
Select A.MemberGroupID
,B.*
From [dbo].[RoleMembers] A
Cross Apply [dbo].[fn_GroupMembers_HasMembershipe](1, A.MemberGroupID ) B
WHERE RoleDefID = 1
这是在SQLServer2014中使用交叉应用的方法使用for循环和用户查询我不想使用游标或for循环。我想使用CTEsp实现什么?它可能是TVF吗?递归cte也是一个循环。。。您可能需要重写您的ptocedure以接受表值参数,而不是使用循环。如果要为每个MemberGroupID调用另一个SP,则不能在CTE中执行此操作,而只能使用循环。Jhon my tvf返回位value@VaibhavBhatia示例2演示了可以在交叉应用程序中进行查询,并返回单个或多个查询多记录/values@jhon我收到错误“无效的对象名'dbo.fn\u GroupMembers\u HasMembershipe'。当我简单调用函数,即选择dbo.fn\u GroupMembers\u HasMembershipe(1,6)时,它将返回正确的值result@VaibhavBhatia您能否自行调用函数Select*from dbo.fn\u GroupMembers\u HasMembershipe(anyPrameters)@jhon:是的……我调用了类似“Select dbo.fn\u GroupMembers\u HasMembershipe(1,6)”的函数,它提供了正确的结果,所以函数不是表值函数,而是标量值函数。十字架不会适用necessary@jhon有没有可能我可以一个接一个地得到值,这样我就可以应用过滤器或任何逻辑。我要做的是发送MemberGroupID,我的函数返回'true'或'false'。如果它返回false,我将发送另一个MemberGroupID;如果它返回true,我将破坏它并返回true。不使用游标是否可能?您需要编辑问题并提供一些示例数据和/或用例。这可能需要也可能不需要光标。
Declare @YourTable table (ID int, Value varchar(max))
Insert Into @YourTable values
(1,'New York;Albany;Providence'),
(2,'Atlanta;Kinderhook')
Select A.ID
,B.*
From @YourTable A
Cross Apply (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(A.Value,';','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B
ID RetSeq RetVal
1 1 New York
1 2 Albany
1 3 Providence
2 1 Atlanta
2 2 Kinderhook
Select B.*, A.MemberGroupID
From [dbo].[RoleMembers] A
CROSS APPLY (Select db = dbo.fn_GroupMembers_HasMembershipe(A.MemberGroupID,6)) B
WHERE RoleDefID = 1