2016-04-27 64 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