2017-06-21 18 views
-1

我想创建它接受表名,开始日期一dyamic过程日期和结束日期 肚里等一起创建表这个`程序与日期

alter procedure task_date @tablename nvarchar(max), @start as datetime,@end as datetime 
as begin 

declare @t1 as nvarchar(max) 
declare @t2 as nvarchar(max) 

set @t1='create table '[email protected]+'_'[email protected]+'(int id)' 
set @t1='create table '[email protected]+'_'[email protected]+'(int id)' 

exec(@t1) 
exec(@t2) 
end 

`

如果我传递参数给我的存储过程这样

`exec task_date name,'21/2/2017','24/2/2016`' 

那么就应该创建两个表为abc_21Feb2017abc_22Feb2017abc_23Feb2017abc_24Feb2017,指的日期也应建立与STARTDATE一起表和以下划线分离 - ENDDATE

注意区别:我的代码错在这里,我想用正确的逻辑沿着正确的代码,帮助我

回答

1

你可以尝试以下解决方案:

DECLARE @StartDate DATE = '2017-02-22'; 
DECLARE @EndDate DATE = '2017-02-24'; 

DECLARE @SqlStatement NVARCHAR(MAX) = N''; 

WITH Num10(Number) 
AS (
    SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL 
    SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 
), 
Num100(Number) 
AS (
    SELECT (a.Number - 1)*10 + b.Number FROM Num10 a CROSS JOIN Num10 b 
) 
SELECT @SqlStatement = @SqlStatement 
      + N'CREATE TABLE ' + N'dbo.CocoJamboTable' + N'_' + REPLACE(CONVERT(VARCHAR(25), DATEADD(DAY, n.Number - 1, '2017-02-22'), 106), ' ', '') + N'(INT ID)' 
      + CHAR(13) + CHAR(10) 
FROM Num100 n 
WHERE n.Number <= DATEDIFF(DAY, @StartDate, @EndDate) + 1; 
PRINT @SqlStatement 
--EXEC sp_executesql @SqlStatement 

这将生成并执行(--UNCOMMENT LAST LINE)以下脚本:

CREATE TABLE dbo.CocoJamboStupidNameTable_22Feb2017(ID INT) 
CREATE TABLE dbo.CocoJamboStupidNameTable_23Feb2017(ID INT) 
CREATE TABLE dbo.CocoJamboStupidNameTable_24Feb2017(ID INT) 

编辑1:

[1] N10和N100的CTE返回这些热膨胀系数可以与数字的表来代替图1和10或11和100之间 的所有数字。这种表格的一个例子可以在here找到。

[2]主SELECT语句返回N100 CTE或数字表中的数字(从1开始)。

[3] DATEDIFF(DAY, @StartDate, @EndDate) + 1计算@StartDate和@EndDate之间的天数,包括(+1)最后一个(@EndDate)。例如,在2017-02-22和2017-02-24之间的天数不是2(24-22),而是2 + 1 = 3(如果我们考虑22但也是24)。

[4] WHERE n.Number <= DATEDIFF(DAY, @StartDate, @EndDate) + 1;筛选1和天数之间的所有数字(=开始日期和结束日期之间的差异)。

[5] SELECT DATEADD(DAY, n.Number - 1, '2017-02-22')计算起始日期和结束也日之间的所有日期:2017年2月22日,23日,24

[6] SELECT N'CREATE TABLE .... DATEADD(DAY, n.Number, ...将生成SQL CREATE TABLE脚本开始日期之间的每个日期和结束日期。

+0

int id应该是id int? –

+0

你纠正它应该是ID INT,纠正我在几个地方 –

+0

@ P.Salmon:更新。谢谢。 –

1

一个简单的while循环与最新的测试就足够

use sandbox 
go 
drop procedure p 
go 
CREATE procedure [dbo].[p] 
@start date , 
@end  date 
as 
declare @t nvarchar(max) 

while @start <= @end 
begin 
set @t= concat('create table abc_',replace(cast(@start as varchar(10)),'-','_'),char(40), 'id int' ,char(41)) 

print @t 
EXEC sp_executesql @t 
set @start = dateadd(d,1,@start) 

end 

GO 

exec dbo.p '2017-06-21','2017-06-25' 

select table_name from information_schema.tables where table_name like 'abc%' 

结果

table_name 
-------------- 
abc_2017_06_21 
abc_2017_06_22 
abc_2017_06_23 
abc_2017_06_24 
abc_2017_06_25 

注意使用的ASCII字符,左,右括号和更换,以拆除违法 - 表名称。