web-dev-qa-db-fra.com

boucle sql sur chaque ligne d'un tableau

J'ai créé un programme qui génère des signaux d'achat et de vente d'actions. J'ai également créé une logique qui teste les différents signaux et fournit le retour pour chaque transaction.

L'étape suivante consiste à simuler la stratégie et ses règles sur une longue période. Toutes les informations sont exportées dans des fichiers texte et importées dans une table dans une base de données SQL Server. J'ai réalisé que je dois déclarer un certain nombre de variables telles que StartCapital, CurrentCapital, NumberOfPositions, PositionsLeft. L'une des colonnes est nommée BuyPrice et indique quand acheter et à quel prix, lorsque cela se produit, NumberOfPositions doit être soustrait de 1.

La colonne SellPrice indique quand vendre et à quel prix, quand cela se produit NumberOfPositions doit être ajouté par un. Le maximum de NumberOfPositions doit être 5 et le minimum 0. Le résultat souhaité est de voir comment le CurrentCapital se déroule.

J'apprécierais beaucoup toute entrée et une sorte de code SQL pour commencer le formulaire.

6
vighurt

Il existe une autre façon de boucler. J'ai vu beaucoup de réponses incrémenter le compteur de 1. Cependant, d'après mon expérience, il n'y a aucune garantie que vos identifiants dans l'ensemble de données n'auront pas de lacunes.

Voici une solution que j'utilise souvent:

declare @idColumn int

select @idColumn = min( TableID ) from Table

while @idColumn is not null
begin
    /*
        Do all the stuff that you need to do
    */
    select @idColumn = min( TableID ) from Table where TableID > @idColumn
end
26
Owen

Basé sur la légende de votre question. C'est la façon dont je boucle à travers chaque ligne d'une table en utilisant une variable de type TABLE:

DECLARE
    @counter    INT = 1,
    @max        INT = 0

-- Declare a variable of type TABLE. It will be used as a temporary table.
DECLARE @myTable TABLE (
    [Id]        int identity,
    [Column1]   nvarchar(max),
    [Column2]   nvarchar(100)
)

-- Insert your required data in the variable of type TABLE
INSERT INTO @myTable
SELECT Column1, Column2
FROM [dbo].[YOUR_DATABASE_TABLE]

-- Initialize the @max variable. We'll use thie variable in the next WHILE loop.
SELECT @max = COUNT(ID) FROM @myTable

-- Loop 
WHILE @counter <= @max
BEGIN

    -- Do whatever you want with each row in your table variable filtering by the Id column
    SELECT Column1, Column2
    FROM @myTable
    WHERE Id = @counter

    SET @counter = @counter + 1
END
10
Jorge E. Hernández