创建表以及日期的过程

时间:2017-06-21 09:53:02

标签: sql-server sql-server-2008 stored-procedures

我想创建一个接受tablename,startdate和enddate的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 '+@tablename+'_'+@start+'(int id)'
set @t1='create table '+@tablename+'_'+@end+'(int id)'

exec(@t1)
exec(@t2)
end

`

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

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

然后它应该创建两个表abc_21Feb2017abc_22Feb2017abc_23Feb2017abc_24Feb2017,表示日期之间的差异也应该作为表格与startdate和enddate一起创建下划线分离

注意:我的代码在这里错了,我想要正确的代码以及正确的逻辑,帮帮我

2 个答案:

答案 0 :(得分: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或1和100之间的所有数字。 这些CTE可以用带数字的表替换。可以找到此类表格的一个示例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-02-22,23,24。

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

答案 1 :(得分: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字符,并在表名中使用replace来删除非法 -