2016-04-27 29 views
0

2つの引数をとるストアドプロシージャを実行したい。最初の引数は常に'%'で、2番目の引数は最後の作業日です。今日が月曜日の場合、最後の作業日は金曜日です。今日が火曜日で、最後の作業日が月曜日である場合などです。SQL Server - 動的SQLのハイフン

また、動的に置き換えられる日付の前後に'を追加します。

私はこのコードを思い付いた:私はちょうど私は、としてそれを実行することができ@ppvを削除した場合

declare @passPar datetime 
declare @ppv nvarchar(100) 
set @passPar = case 
when (DATEPART(WEEKDAY, GETDATE())) = 1 then convert (nvarchar(10),dateadd(day,-2,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 2 then convert (nvarchar(10),dateadd(day,-3,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 3 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 4 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 5 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 6 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
end 
set @ppv = N' Execute spCreateReports '%' + ''' @passPar ''' 
; 
Execute spCreateReports '%', @passPar 

。変換 Execute spCreateReports '%', @passPar、例えば、 Execute spCreateReports '%', 2016-04-27しかし所望の結果私が使用(およびSSISで働くが、SQLサーバーにOK見えていない)された元のSQLコード Execute spCreateReports '%', '2016-04-27'

である:

declare @passPar datetime 
set @passPar = case 
when (DATEPART(WEEKDAY, GETDATE())) = 1 then convert (nvarchar(10),dateadd(day,-2,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 2 then convert (nvarchar(10),dateadd(day,-3,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 3 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 4 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 5 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
when (DATEPART(WEEKDAY, GETDATE())) = 6 then convert (nvarchar(10),dateadd(day,-1,getDate()),101) 
end 
; 
Execute spCreateReports '%', @passPar 

これを行う方法上の任意のアイデア、素晴らしいことだ

EDIT

以下の作業コード:私は右のそれを取得する場合、コードとしても、コンパイルされませんが、あなたは変数に動的SQLを割り当てて、それを実行したことがないように見える

declare @passPar nvarchar(50) 
set @passPar = case 
when (DATEPART(WEEKDAY, GETDATE())) = 1 then convert (nvarchar(10),dateadd(day,-2,getDate()),120) 
when (DATEPART(WEEKDAY, GETDATE())) = 2 then convert (nvarchar(10),dateadd(day,-3,getDate()),120) 
when (DATEPART(WEEKDAY, GETDATE())) = 3 then convert (nvarchar(10),dateadd(day,-1,getDate()),120) 
when (DATEPART(WEEKDAY, GETDATE())) = 4 then convert (nvarchar(10),dateadd(day,-1,getDate()),120) 
when (DATEPART(WEEKDAY, GETDATE())) = 5 then convert (nvarchar(10),dateadd(day,-1,getDate()),120) 
when (DATEPART(WEEKDAY, GETDATE())) = 6 then convert (nvarchar(10),dateadd(day,-1,getDate()),120) 
end 
; 
Execute spCreateReports '%', @passPar 
+0

私はこの問題を理解していません。なぜ2番目のバージョンは機能しませんか?あなたがそれを使用するとどうして失敗するのですか? –

+0

SSISでは、第2版でタスクを実行するだけで何も起こりません。正しく実行されたように見えますが、ストアドプロシージャは実際には実行されません。私はおそらく(たとえそれが日付の前後になくても動作するはずだが)私はそれを追加すべきだと思っている。 – CM2K

+0

より良い質問は単純に次のようになりました。なぜ2番目のコードがSSIS SQLタスクで動作しないのですか(接続がテーブルを切り捨てるという別の作業をしてからうまく動作しています) – CM2K

答えて

1

わかりません。最後にEXEC(@ppv)を追加してみてください。

編集:私はコメントに答えることができないので、私はここに書きます何らかの理由:

@passParデータ型を変更してみてください、それは(10)@passParのnvarchar型を宣言する必要があり、その後、あなたドン引用符を追加する必要はありません。動的SQLは必要ありません。

+0

元のコードコードの2番目のスニペット)。それをどのように変更して出力しますか? 'Execute spCreateReports '%'、 '2016-04-26''? – CM2K

+0

10は私のものではありませんが、あなたの考えでは、日付をvarchar(10)に変換します(コードを見てください))、それをdatetime変数に割り当てます。 varcharに変換する場合は、varcharに固執します。とにかく、varcharはあなたのプロシージャが期待しているものです。 – Limonka

+0

あなたは@passParのデータ型について正しいと思います。スタイル101から120までの日付として表示される方法も変更しました。ありがとう – CM2K

関連する問題