我想创建一个接受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_21Feb2017
,abc_22Feb2017
,abc_23Feb2017
,abc_24Feb2017
,表示日期之间的差异也应该作为表格与startdate和enddate一起创建下划线分离
注意:我的代码在这里错了,我想要正确的代码以及正确的逻辑,帮帮我
答案 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来删除非法 -