65

次の SQL クエリがあります。

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

これは当然 '1/1/2010' を返します。

私がやりたいのは、日付のリストを持っていることです。

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

次に、数値を FOR EACH して SQL クエリを実行します。

(疑似コード) のようなもの:

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

したがって、これは次のように返されます:-

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

これにより、データが複数の結果セットではなく 1 つの結果セットとして返されるようにしたいので、クエリの最後で何らかのユニオンを使用する必要がある場合があります。

編集

「to date」パラメーターを受け入れる大規模なクエリがあります。24 回実行する必要があり、毎回特定の to date を指定する必要があります (これらの日付は動的になります) 回避したい戻ってきて追加の列を追加する必要があるかのように、ユニオンオールを結合してクエリを24回繰り返すと、非常に時間がかかります。

4

7 に答える 7

70

SQL は基本的にセット指向の言語です。一般に、SQL でループを使用することはお勧めできません。

この場合、再帰的な 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
于 2012-04-24T14:57:06.477 に答える
33

テーブル変数のオプションは次のとおりです。

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

一時テーブルでも同じことができます。

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

@JohnFxが言ったように、あなたの主な目標は何であるかを教えてください。これはおそらく別の(より効率的な)方法で行うことができます。

于 2012-04-24T14:54:21.873 に答える
16

次のように、変数テーブルを使用できます。

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
于 2012-04-24T14:55:17.020 に答える
7

この種類は、結果で何をしたいかによって異なります。数値だけを知りたい場合は、セットベースのオプションは数値表になります。これは、あらゆる種類のものに役立ちます。

MSSQL 2005+ では、再帰 CTE を使用して数値テーブルをインラインで生成できます。

;WITH Numbers (N) AS (
    SELECT 1 UNION ALL
    SELECT 1 + N FROM Numbers WHERE N < 500 
)
SELECT N FROM Numbers
OPTION (MAXRECURSION 500)
于 2012-04-24T14:57:21.263 に答える
5
declare @counter as int
set @counter = 0
declare @date as varchar(50)
set @date = cast(1+@counter as varchar)+'/01/2013'
while(@counter < 12)
begin 
select  cast(1+@counter as varchar)+'/01/2013' as date
set @counter = @counter + 1
end
于 2013-07-12T16:22:19.217 に答える
1
[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]
于 2015-03-19T12:20:35.417 に答える