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

obige Abfrage funktioniert gut in meiner gespeicherten Prozedur. Aber es wird viele Zeilen zurückgeben, so dass ich alle Zeilen iterieren und MemberGroupID verwenden möchte, um eine andere gespeicherte Prozedur aufzurufen.Wie CTE-Ergebnis zu iterieren

Wie kann ich das tun?

+0

Verwenden Schleife und Benutzer die Abfrage –

+0

ich möchte nicht Cursor verwenden oder für loop.I wollen mit CTE –

+0

implementieren Was macht der SP? Kann es ein TVF sein? –

Antwort

3

Wie gewünscht, und nicht zu wissen, was Ihre SP tut/Rückgabe:

Denken Sie an einen CROSS APPLY wie ein Unterprogramm

Beispiel 1:

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

Beispiel 2 :

Das folgende wird eine getrennte Zeichenfolge nach ID aufteilen und deaktivieren

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 

Returns

ID RetSeq RetVal 
1 1  New York 
1 2  Albany 
1 3  Providence 
2 1  Atlanta 
2 2  Kinderhook 
+0

Jhon mein tvf gibt BIT-Wert zurück –

+0

@VaibhavBhatia Dann sollte Beispiel 1 den Trick tun –

+0

@VaibhavBhatia Beispiel 2 war zu demonstrieren, dass Sie Abfragen innerhalb der haben können CROSS APPLY und Rückgabe eines einzelnen oder mehrerer Datensätze/Werte –

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

dies der Weg Kreuz in Sqlserver Nehmen verwenden 2014

+1

So Funktion ist keine Table Valued-Funktion, sondern eine Scalar Valued-Funktion. Das Kreuz APPLY wäre nicht notwendig –

+0

@jhon ist es möglich, ich kann Wert eins nach dem anderen bekommen, so dass ich Filter oder jede Logik darauf anwenden kann. Was ich tun muss ist, ich werde MemberGroupID senden und meine Funktion gibt 'true' oder 'false' zurück. Wenn es false zurückgibt, dann werde ich eine andere MemberGroupID senden oder wenn es wahr zurückgibt, werde ich es brechen und true zurückgeben. ist es möglich ohne Cursor? –

+0

Sie müssen Ihre Frage bearbeiten und einige Beispieldaten und/oder einen Anwendungsfall angeben. Dies kann einen CURSOR erfordern oder nicht. –