SQL-Abfrage, um Top-Zeilen bis ColName = 1 zu erhalten

Ich speichere eine list von Nachrichten in meiner database (so dass, wenn ich abstürze, werde ich sie nicht verlieren).

Aber wenn ich sie herausziehe, muss ich sie in Klumpen herausziehen und in Ordnung.

Was ich suche ist eine Abfrage, die mir die Top x Zeilen bis Spalte IsWeirdMessage = 1 geben wird.

Also, vorausgesetzt, ich habe einen Tisch, der so aussieht:

 CREATE TABLE MyMessages(MessageId bigint IDENTITY(1,1), MyMessage varchar(100), IsWeirdMessage bit) INSERT INTO MyMessages(MyMessage, IsWeirdMessage) SELECT 'SomeValue1', 0 UNION ALL SELECT 'SomeValue2', 0 UNION ALL SELECT 'SomeValue3', 0 UNION ALL SELECT 'SomeValue3', 0 UNION ALL SELECT 'SomeValue4', 0 UNION ALL SELECT 'SomeValue5', 0 UNION ALL SELECT 'WeirdThingHere', 1 UNION ALL SELECT 'SomeValue7', 0 UNION ALL SELECT 'SomeValue8', 0 UNION ALL SELECT 'SomeValue9', 0 UNION ALL SELECT 'OtherWeirdStuff', 1 UNION ALL SELECT 'SomeValue11', 0 GO 

Wie könnte ich eine Abfrage erstellen , die mir ein paar Leute über SomeValue5 (in Reihenfolge) IsWeirdMessage , die sich von IsWeirdMessage ?

So etwas sollte es tun:

 select * from MyMessages where messageid > @MessageID and messageid <= (select min(messageid) from MyMessages where IsWeirdMessage = 1 and messageid > @MessageID) order by messageid 

Wo die @MessageID der Wert der letzten komischen Nachricht ist, die du abgerufen hast. Sie würden mit 0 beginnen, um die erste Charge zu bekommen, dann 7, um die zweite Charge zu bekommen usw.

Demo: http://www.sqlfiddle.com/#!3/10336/9

 SELECT m.MessageID, m.MyMessage FROM dbo.MyMessages AS m WHERE NOT EXISTS ( SELECT 1 FROM dbo.MyMessages AS m2 WHERE IsWeirdMessage = 1 AND m2.MessageID < m.MessageID ) ORDER BY MessageID; 
 select b.* from ( select row_number() over (order by (select 1)) as PartitionId ,isnull((select max(t.MessageId) from MyMessages t where t.MessageId < tb.MessageId and t.IsWeirdMessage = 1), 0) as StartID ,tb.MessageId as EndId from MyMessages tb where IsWeirdMessage = 1 union all select count(case when IsWeirdMessage = 1 then MessageId else null end) + 1 ,max(case when IsWeirdMessage = 1 then MessageId else 0 end) ,max(messageId) + 1 from MyMessages ) as a cross apply ( select * from MyMessages b where b.MessageId > a.StartID and b.MessageId < a.EndID ) as b where a.PartitionId = @PartID 

wo die @PartID ist Identifier von Partition, die Sie wählen möchten