2017-02-03 109 views
-1
WITH cte AS 
(
    SELECT MemberGroupID 
    FROM [dbo].[RoleMembers] WITH(NOLOCK) 
    WHERE RoleDefID = 1 
) 
SELECT * FROM cte 

上述查詢在我的存儲過程中正常工作。但它會返回很多行,所以我想迭代所有行並使用MemberGroupID來調用另一個存儲過程。如何迭代CTE結果

我該怎麼做?

+0

使用循環和用戶查詢 –

+0

我不想使用光標或loop.I想要使用CTE執行 –

+0

SP是做什麼的?它可以成爲TVF嗎? –

回答

3

按照要求,不知道你的SP做什麼/回:

交叉的思考APPLY像一個子程序

例1:

Select A.MemberGroupID 
     ,B.* 
From [dbo].[RoleMembers] A 
Cross Apply [dbo].[fn_GroupMembers_HasMembershipe](1, A.MemberGroupID) B 
WHERE RoleDefID = 1 

例2 :

以下內容將按ID拆分並取消分隔的字符串

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 
+0

Jhon我的tvf返回BIT值 –

+0

@VaibhavBhatia然後例1應該做的竅門 –

+0

@VaibhavBhatia例2是爲了證明你可以在CROSS APPLY並返回一個或多個記錄/值 –

0
Select B.*, A.MemberGroupID 
From [dbo].[RoleMembers] A 
CROSS APPLY (Select db = dbo.fn_GroupMembers_HasMembershipe(A.MemberGroupID,6)) B 
WHERE RoleDefID = 1 

這個使用十字sqlserver的應用方式2014

+1

所以函數不是一個表值函數,而是一個標量值函數。交叉申請將不是必要的 –

+0

@jhon是否有可能我可以逐一獲得價值,這樣我就可以應用過濾器或任何邏輯。我要做的是我將發送MemberGroupID和我的函數返回'true'或'false'.if它返回false然後我會發送另一個MemberGroupID或如果它返回true,然後我會打破它,並返回true。沒有光標可能嗎? –

+0

您需要編輯您的問題並提供一些示例數據和/或用例。這可能需要也可能不需要CURSOR。 –