在表中动态创建列

时间:2013-07-18 09:26:51

标签: sql sql-server database sql-server-2008

我在My procedure中创建了一个表。 我有开始日期和结束日期值。我希望创建具有此日期范围的列,例如,如果开始日期是2013年7月15日,结束日期是2013年7月18日,那么将创建4列(7月1日,7月2日,7月3日,7月4日)。

我怎样才能做到这一点。我用过sql server 2008 .. 请帮帮我......

先生来自前端我已经提交了日期和Todate字段然后提交我已经从我的C#代码调用了Sp,现在我想在我的Proc中创建一个表。表必须没有。列与否。在给定日期之间存在天数。

2 个答案:

答案 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)

您可能已经接受了上述答案,但即使想要这样做也很好地违背了关系数据库背后的原则。我会认真考虑你要做的和你的方法。