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