Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 创建带有日期的表的过程_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql server 创建带有日期的表的过程

Sql server 创建带有日期的表的过程,sql-server,sql-server-2008,stored-procedures,Sql Server,Sql Server 2008,Stored Procedures,我想创建一个接受tablename、startdate和enddate的动态过程 是这样的` 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+

我想创建一个接受tablename、startdate和enddate的动态过程 是这样的`

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_21Feb2017、abc_22Feb2017、abc_23Feb2017、abc_24Feb2017,这意味着日期之间的差异也应该创建为带有下划线分隔的startdate和enddate表


注意:我的代码在这里是错误的,我需要正确的代码和正确的逻辑,请帮助我解决问题

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

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
编辑1:

[1] N10和N100 CTEs返回1到10或1到100之间的所有数字。 这些CTE可以替换为带有数字的表格。可以找到此类表格的示例

[2] 主SELECT语句返回N100 CTE或数字表中以1开头的数字

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


[4] 其中n.Number一个简单的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%'

请注意,左括号和右括号使用ascii字符,替换以删除表名中的非法字符。

int-id应该是id-int?您更正它应该是id-int,请用几句话更正我places@P.Salmon:更新。谢谢。还有其他答案吗?因为我不想碰到工会和工会的复杂性all@navs当前位置请你重新措辞/解释下面的句子好吗我不想遇到。。。而所有这些–?
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