Comment sélectionner uniquement les lignes écrites sur le disque?

Exécution de SQL Server 2012 Je me request s'il est possible de sélectionner des lignes dans une table, à l'exclusion des lignes qui n'ont pas encore été validées – dans la transaction en cours. J'ai essayé l'indice READPAST , mais cela ne fonctionne pas.

 CREATE TABLE [dbo].[A]( [ID] [int] IDENTITY(1,1) NOT NULL, [Value] [int] NULL CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED ([ID] ASC)) ON [PRIMARY] GO INSERT INTO A (Value) VALUES (1) GO BEGIN TRANSACTION INSERT INTO A (Value) VALUES(2) SELECT * FROM A WITH (READPAST) -- Does not work! COMMIT TRANSACTION 

Le code ci-dessus va sortir deux lignes. Je veux que seulement la première rangée soit sortie. Cela peut-il être réalisé? (Je sais que je peux exécuter le SELECT avant l' INSERT mais malheureusement ce n'est pas possible dans mon application.)

Je ne connais pas un moyen de rendre SQL Server traiter écrit dans la propre transaction comme étranger. Par conséquent, vous devez lire une transaction différente. C'est assez facile si vous pouvez faire l'application le faire.

Si vous avez besoin de code T-SQL pour le faire, vous pouvez envisager d'utiliser un server lié loopback . Cela ressemble à un hack horrible, cependant, et je ne suis même pas sûr que les servers liés loopback sont pris en charge.

Et je voudrais nettoyer une petite idée fausse: Que les lignes soient validées ou pas n'a pas de relation directe à savoir si les pages sur lesquelles elles sont stockées ont déjà été écrites sur le disque.

Sauvegardez la table dans un temp avant l'insertion avec

 SELECT * INTO #TempTable FROM a 

puis utilisez la sauvegarde temporaire au lieu de la table régulière avec votre code (la partie de la transaction), il sera

 BEGIN TRANSACTION SELECT * INTO #TempTable FROM a INSERT INTO A (Value) VALUES(2) SELECT * FROM #TempTable COMMIT TRANSACTION