SQL Server VOOR ELKE Loop

Ik heb de volgende SQL-query:

DECLARE @MyVar datetime = '1/1/2010'    
SELECT @MyVar

Dit geeft natuurlijk ‘1/1/2010’ terug.

Ik wil een lijst met datums hebben, bijvoorbeeld:

1/1/2010
2/1/2010
3/1/2010
4/1/2010
5/1/2010

Vervolgens wil ik VOOR ELK de cijfers doornemen en de SQL-query uitvoeren.

Zoiets als (pseudocode):

List = 1/1/2010,2/1/2010,3/1/2010,4/1/2010,5/1/2010
For each x in List
do
  DECLARE @MyVar datetime = x
  SELECT @MyVar

Dus dit zou terugkeren:-

1/1/2010
2/1/2010
1-3-2010
4/1/2010
1-5-2010

Ik wil dat dit de gegevens retourneert als één resultatenset, niet als meerdere resultatensets, dus het kan zijn dat ik een soort unie aan het einde van de query moet gebruiken, dus elke iteratie van de lus-verenigingen naar de volgende.

bewerken

Ik heb een grote query die een ‘to date’-parameter accepteert, ik moet deze 24 keer uitvoeren, elke keer met een specifieke datum die ik moet kunnen leveren (deze datums zullen dynamisch zijn) Ik ik wil voorkomen dat ik mijn vraag 24 keer herhaal met alle leden van de vakbond, alsof ik terug moet komen om extra kolommen toe te voegen, dat zou erg tijdrovend zijn.


Antwoord 1, autoriteit 100%

SQL is in de eerste plaats een set-georiënteerde taal – het is over het algemeen een slecht idee om er een lus in te gebruiken.

In dit geval kan een vergelijkbaar resultaat worden bereikt met een recursieve CTE:

with cte as
(select 1 i union all
 select i+1 i from cte where i < 5)
select dateadd(d, i-1, '2010-01-01') from cte

Antwoord 2, autoriteit 45%

Hier is een optie met een tabelvariabele:

DECLARE @MyVar TABLE(Val DATETIME)
DECLARE @I INT, @StartDate DATETIME
SET @I = 1
SET @StartDate = '20100101'
WHILE @I <= 5
BEGIN
    INSERT INTO @MyVar(Val)
    VALUES(@StartDate)
    SET @StartDate = DATEADD(DAY,1,@StartDate)
    SET @I = @I + 1
END
SELECT *
FROM @MyVar

Je kunt hetzelfde doen met een tijdelijke tabel:

CREATE TABLE #MyVar(Val DATETIME)
DECLARE @I INT, @StartDate DATETIME
SET @I = 1
SET @StartDate = '20100101'
WHILE @I <= 5
BEGIN
    INSERT INTO #MyVar(Val)
    VALUES(@StartDate)
    SET @StartDate = DATEADD(DAY,1,@StartDate)
    SET @I = @I + 1
END
SELECT *
FROM #MyVar

U moet ons vertellen wat uw belangrijkste doel is, zoals werd gezegd door @JohnFx, dit kan waarschijnlijk op een andere (efficiëntere) manier worden gedaan.


Antwoord 3, autoriteit 22%

Je zou een variabele tabel kunnen gebruiken, zoals deze:

declare @num int
set @num = 1
declare @results table ( val int )
while (@num < 6)
begin
  insert into @results ( val ) values ( @num )
  set @num = @num + 1
end
select val from @results

Antwoord 4, autoriteit 10%

Dit hangt af van wat u met de resultaten wilt doen. Als u net achter de cijfers aanzit, is een op sets gebaseerde optie een tabel met getallen– die komt van pas voor allerlei dingen.

Voor MSSQL 2005+ kunt u een recursieve CTE gebruiken om een getallentabel inline te genereren:

;WITH Numbers (N) AS (
    SELECT 1 UNION ALL
    SELECT 1 + N FROM Numbers WHERE N < 500 
)
SELECT N FROM Numbers
OPTION (MAXRECURSION 500)

Antwoord 5, autoriteit 7%

declare @counter as int
set @counter = 0
declare @date as varchar(50)
set @date = cast([email protected] as varchar)+'/01/2013'
while(@counter < 12)
begin 
select  cast([email protected] as varchar)+'/01/2013' as date
set @counter = @counter + 1
end

Antwoord 6, autoriteit 3%

Natuurlijk een oude vraag. Maar ik heb een eenvoudige oplossing waarbij looping, CTE, tabelvariabelen enz. niet nodig zijn.

DECLARE @MyVar datetime = '1/1/2010'    
SELECT @MyVar
SELECT DATEADD (DD,NUMBER,@MyVar) 
FROM master.dbo.spt_values 
WHERE TYPE='P' AND NUMBER BETWEEN 0 AND 4 
ORDER BY NUMBER

Opmerking:spt_valuesis een ongedocumenteerde tabel van Mircrosoft. Het heeft nummers voor elk type. Het is niet aan te raden om het te gebruiken, omdat het zonder voorafgaande informatie kan worden verwijderd in nieuwe versies van de sql-server, omdat het niet is gedocumenteerd. Maar we kunnen het als snelle oplossing gebruiken in sommige scenario’s zoals hierboven.


Antwoord 7

[CREATE PROCEDURE [rat].[GetYear]
AS
BEGIN
-- variable for storing start date
Declare @StartYear as int
-- Variable for the End date 
Declare @EndYear as int 
-- Setting the value in strat Date
select @StartYear = Value from   rat.Configuration where Name = 'REPORT_START_YEAR'; 
-- Setting the End date 
select @EndYear = Value from   rat.Configuration where Name = 'REPORT_END_YEAR'; 
-- Creating Tem table 
    with [Years] as
    (
        --Selecting the Year
        select @StartYear [Year] 
        --doing Union 
        union all
         -- doing the loop in Years table 
         select Year+1 Year from [Years] where Year < @EndYear
     )
    --Selecting the Year table 
selec]

Other episodes