2017-02-28 8 views
1
DECLARE @pinterval INT = 1, @DayPlus DATETIME = '2016-07-01', @datepart VARCHAR(20) = 'MONTH' 
SET @DayPlus = DATEADD(@datepart, @pinterval, @DayPlus) 
SELECT @DayPlus 

タスクを実行するための方法はありますか?私はループでそれをしなければならないので、間隔の値に基づいて毎回定義することはできません。私はDATEADDで変数を使用できません(@pinterval、@pinterval、@DayPlus)

DATEADD(MONTH, @pinterval, @DayPlus) 

として使用する場合、それは正常に動作しているためのみ日付の部分は変数として認められません。わかりませんが、私は問題を理解することができますが、私は迅速な解決策を模索しています。私はウェブにアクセスしましたが、正確な解決策は得られませんでした。

+0

変数のようなものを生成はい、DATEADD' 'の最初の引数は日付コンポーネントの*名*である必要があります。 *日付コンポーネントの名前を含む文字列*(リテラルまたは変数)ではありません。 –

+0

つまり、とにかくできませんか? – Susang

+0

はいそれは...動的クエリを使用しています – Rahul

答えて

4

それはどのようなここに望まれることは名前、ない文字列であることから、 DATEADDに最初の引数に変数を代入することはできません。これはでもマニュアルには記載されて

SET @DayPlus = 
CASE @datepart 
    WHEN 'MONTH' THEN DATEADD(MONTH, @pinterval, @DayPlus) 
    WHEN 'YEAR' THEN DATEADD(YEAR, @pinterval, @DayPlus) 
    WHEN 'DAY' THEN DATEADD(DAY, @pinterval, @DayPlus) 
    --TODO - add all parts you might wish to use 
END 

ユーザー定義変数同等物は、有効ではありませんあなたができる最善について

CASE式です。

+0

これが唯一の方法であれば、応答していただきありがとうございます。私はその多くの日付部分で作業している場合、これを10回以上繰り返す必要がありますか? – Susang

+0

@Surazさんはおそらく... 'CROSS APPLY(SELECT ...)AS t'について読む。これにより、計算を1回実行し、結果を名前付きの派生列として使用することができます。* – Shnugo

+0

@Shnugoそれは良い音です。答えとして完全なコードを入れることで助けてください。お願いします !! – Susang

1

あなたは、動的SQLを使用することができます。

DECLARE @pinterval INT = 1, 
    @DayPlus DATETIME = '2016-07-01', 
    @datepart NVARCHAR(20) = 'MONTH' 

DECLARE @sql NVARCHAR(MAX) = N'SET @DayPlus = DATEADD('[email protected]+', @pinterval, @DayPlus)', 
     @params NVARCHAR(MAX) = N'@DayPlus DATETIME OUTPUT, @pinterval INT' 

EXEC sp_executesql @sql, @params, @pinterval = @pinterval, @DayPlus = @DayPlus OUTPUT 

SELECT @DayPlus 

sp_executesqlは2つの理由のために使用されます:SQLインジェクションのリスクを最小限に抑えるために

  1. 、それが理由@datepart
  2. のそれを排除しません動的クエリの計画がキャッシュされることを確認します。これは、単純なクエリ(クエリ時間とコンパイル時間の関係)に役立ちます。
+1

'@DayPlus = @DayPlus OUTPUT'実際に結果を戻したい場合は、 –

+0

@Damien_The_Unbelieverありがとう!それを逃しました。 –

2

その後、私はそれが良い音@Shnugo CROSS APPLY

を使用し、より10times

ないためにこれを繰り返す必要があり、これが唯一の方法であれば、あなたが助けてくださいすることができます私は答えとして完全なコードを配置することでお願いします !!

についてCROSS APPLY:動的

CREATE TABLE dbo.Test(ID INT, SomeDate DATE); 
GO 
INSERT INTO dbo.Test VALUES(1,{d'2017-01-01'}),(2,{d'2017-02-02'}) 
GO 
DECLARE @Intervall VARCHAR(100)='DAY'; 
DECLARE @Count INT=1 

SELECT dbo.Test.* 
     ,t.AddedDate 
FROM dbo.Test 
CROSS APPLY(SELECT CASE @Intervall WHEN 'MONTH' THEN DATEADD(MONTH,@Count,SomeDate) 
            WHEN 'DAY' THEN DATEADD(DAY,@Count,SomeDate) 
            ELSE SomeDate END AS AddedDate) AS t; 

GO 
DROP TABLE dbo.Test; 
+0

あなたの努力と別個の解決策に感謝します。 – Susang

関連する問題