我在My procedure中创建了一个表。 我有开始日期和结束日期值。我希望创建具有此日期范围的列,例如,如果开始日期是2013年7月15日,结束日期是2013年7月18日,那么将创建4列(7月1日,7月2日,7月3日,7月4日)。
我怎样才能做到这一点。我用过sql server 2008 .. 请帮帮我......
先生来自前端我已经提交了日期和Todate字段然后提交我已经从我的C#代码调用了Sp,现在我想在我的Proc中创建一个表。表必须没有。列与否。在给定日期之间存在天数。
答案 0 :(得分:2)
试试这个:
DECLARE @dtmin date
DECLARE @dtmax date
DECLARE @dynsql nvarchar(3000)
DECLARE @colname varchar(20)
SET @dynsql = N'CREATE TABLE trial('
SET @dtmin = {d '2013-07-15'}
SET @dtmax = {d '2013-07-18'}
DECLARE @currdate date
SET @currdate = @dtmin
WHILE (@currdate <= @dtmax)
BEGIN
SET @colname = DATENAME(month, @currdate) + CONVERT(varchar, DATEPART(day, @currdate))
SET @dynsql = @dynsql + @colname + ' varchar(10)'
IF (@currdate < @dtmax)
BEGIN
SET @dynsql = @dynsql + ', '
END
ELSE
BEGIN
SET @dynsql = @dynsql + ')'
END
SET @currdate = DATEADD(day, 1, @currdate)
END
EXEC sp_executesql @dynsql
P.S。:我不知道你的请求的原因,但通常这种方式创建表是不正确的,因为要放入列中的信息应该放在行中。
实施例: 如果我想逐日存储销售,那么我名为SALES的正确表是: SALES(id varchar(36),dt datetime,amount decimal(19,2)) 代替 SALES(ID VARCHAR(36),dt1十进制(19,2),dt2十进制(19,2)......等等)
因为如果你想改变你的时期,你必须重写你的表,如果你想查询你的表,你必须为每种情况写几个查询。这张桌子上的工作非常辛苦。
请重新考虑你的选择。
度过愉快的一天。
答案 1 :(得分:0)
您可能已经接受了上述答案,但即使想要这样做也很好地违背了关系数据库背后的原则。我会认真考虑你要做的和你的方法。