2016-04-27 83 views
0

我想執行一個需要2個參數的存儲過程。第一個參數始終是'%',第二個參數是最後一次工作日期。如果今天是星期一,那麼最後的工作日期是星期五,如果今天是星期二,那麼最後的工作日期是星期一,以此類推。SQL Server - 動態sql中的連字符

我想在動態替換日期前後添加'

我這個代碼想出了:

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 

如果我只是刪除@ppv然後我可以執行它; Execute spCreateReports '%', @passPar這轉化爲,例如, Execute spCreateReports '%', 2016-04-27但期望的結果的 Execute spCreateReports '%', '2016-04-27'

原來的SQL代碼我用(以及在SSIS不工作,但在SQL服務器看起來確定)爲:

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 

如何做到這一點任何想法,將是巨大的

編輯

下面

工作代碼:

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

我不明白這個問題。爲什麼第二個版本不工作?它在使用時如何失敗? –

+0

那麼,在SSIS中,如果我只是用第二個版本執行任務,沒有任何反應。它看起來像它被正確執行,但存儲過程並沒有真正執行。我想也許(即使它應該在日期之前和之後沒有'''),我應該添加它。 – CM2K

+0

或者更好的問題可能只是:爲什麼第二段代碼不能在SSIS SQL任務中工作(連接正在工作,因爲有另一個截斷表的任務,並且工作良好) – CM2K

回答

1

不知道如果我得到它的權利,因爲代碼甚至不進行編譯,但它看起來像您指定動態SQL一個變量,並且永遠不會執行。嘗試在最後添加EXEC(@ppv)。

編輯:由於某種原因,我不能評論回答,所以我會在這裏寫:

嘗試改變@passPar數據類型,它應該是申報@passPar爲nvarchar(10),然後你不不需要添加任何引號,也不需要動態的sql,它應該可以工作。

+0

嘗試原始代碼(第二段代碼)。你將如何改變輸出:'執行spCreateReports'%','2016-04-26''? – CM2K

+0

10不是我的,但是你的想法是,你將日期轉換爲varchar(10)(只是看看你的代碼;)),但是把它分配給datetime變量,這是沒有意義的。如果您轉換爲varchar,請使用varchar。無論如何,varchar是你的程序期望的。 – Limonka

+0

你對@passPar的數據類型是正確的。我也改變了它從樣式101到120的顯示方式。謝謝 – CM2K