Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 如何使用循环中的变量创建/添加列_Sql_Sql Server_Create Table_Alter - Fatal编程技术网

Sql 如何使用循环中的变量创建/添加列

Sql 如何使用循环中的变量创建/添加列,sql,sql-server,create-table,alter,Sql,Sql Server,Create Table,Alter,我对SQL非常陌生,因为我刚刚读完,这是我唯一的SQL知识。现在我已经看完了这本书,我正在尝试创建一些表格,这样我就可以玩它们了。我可以轻松地创建一个具有已知列数和指定标题的表。我遇到的问题是创建一个列数未知、标题为日期的表。到目前为止,我尝试的是: DECLARE @start_date AS DATE DECLARE @end_date AS DATE DECLARE @curr_date AS DATE DECLARE @column_name AS CHAR(10) SET @star

我对SQL非常陌生,因为我刚刚读完,这是我唯一的SQL知识。现在我已经看完了这本书,我正在尝试创建一些表格,这样我就可以玩它们了。我可以轻松地创建一个具有已知列数和指定标题的表。我遇到的问题是创建一个列数未知、标题为日期的表。到目前为止,我尝试的是:

DECLARE @start_date AS DATE
DECLARE @end_date AS DATE
DECLARE @curr_date AS DATE
DECLARE @column_name AS CHAR(10)

SET @start_date = 2016-01-02
SET @end_date = 2016-12-31
SET @curr_date = @start_date

WHILE @curr_date < @end_date
    SET @curr_date = DATEADD(DD, 7, @curr_date)
    ALTER TABLE Project_1
        ADD @curr_date  DOUBLE
将@start\u日期声明为日期
将@end_日期声明为日期
将@curr_date声明为日期
将@column_name声明为CHAR(10)
设置@start_date=2016-01-02
设定日期为2016年12月31日
设置@curr\u date=@start\u date
而@curr\u date<@end\u date
设置@curr\u date=DATEADD(DD,7,@curr\u date)
ALTER TABLE Project_1
添加@curr\u date DOUBLE
我在这里试图做的是为循环创建一个起点和终点,并使用存储在局部变量中的循环条件作为我的列标题,因为这是我需要列标题的内容。我还尝试使用
CAST
将其转换为字符,但DBMS很高兴告诉我,在最后一行(添加行)的“@curr\u date”附近有
不正确的语法,因为我尝试使用局部变量命名列(我想)。我没有示例输出,但输出应该是一个表,第一列定义为CHAR,标题为
emp_name
,因为它将包含名称。所有其他列定义为类型
DOUBLE
,并且应为
NULL
,因为它们将包含小时数,并且必须将当前日期作为标题
@curr\u date
。我认为通过
ALTER
方法添加到表中的所有列都默认为
NULL
。我见过动态SQL的例子,其中声明了一个变量来保存select语句,但我不太明白它们是如何向表中添加列的。我不确定这是否可以在
CREATE
语句中完成,但如果可以,那就太好了。此外,这需要是可变的,因为我可以将
@end\u date
更改为。。。他们在2046年结婚


这里的安全性不是问题

我同意所有关于使用行而不是动态添加列的评论,您可以始终动态地透视这些列,这样会更灵活。因此,可能需要考虑一些模式问题,但只是为了回答您的特定问题,您需要在哪里接近

DECLARE @start_date AS DATE
DECLARE @end_date AS DATE
DECLARE @curr_date AS DATE
DECLARE @column_name AS CHAR(10)

SET @start_date = '2016-01-02'
SET @end_date = '2016-12-31'
SET @curr_date = @start_date

WHILE @curr_date < @end_date
BEGIN
    DECLARE @SQL NVARCHAR(MAX)

    SET @curr_date = DATEADD(DD, 7, @curr_date)

    SET @SQL = 'ALTER TABLE TableB
        ADD [' + CAST(@curr_date AS VARCHAR(10)) + ']  FLOAT'

    --PRINT @SQL
    EXECUTE (@SQL)
END
将@start\u日期声明为日期
将@end_日期声明为日期
将@curr_date声明为日期
将@column_name声明为CHAR(10)
设置@start_date='2016-01-02'
设置日期为“2016-12-31”
设置@curr\u date=@start\u date
而@curr\u date<@end\u date
开始
声明@SQL NVARCHAR(最大值)
设置@curr\u date=DATEADD(DD,7,@curr\u date)
SET@SQL='更改表TableB
添加['+CAST(@curr_date AS VARCHAR(10))+']FLOAT'
--打印@SQL
执行(@SQL)
结束

这通常不是您会做的事情,因为模式的用户通常更喜欢固定表定义(而不是基于日期范围具有可变列数的动态表定义)。但是,您可以构造一个sql字符串(
declare@sql varchar(2000)
),用alter语句填充它,然后使用
EXEC
sp\u executesql
运行它,您所说的“头”是什么意思?那是列名吗?您不希望使用日期作为列名。这不仅是痛苦的工作,它是一个非常糟糕的设计标志。另外,考虑一下从今天到2046日每天有多少栏。您将超过最大列数几个数量级。请给我们一个用例,以便我们可以向您展示如何进行更好的设计。@Sean Lange是的,我所说的列标题是指列名。从现在到2046年,我实际上不需要它,但我会让它从一年的开始一直持续到同一年的结束。另外,每个表只需要52列。我真的不知道SQL Server的局限性,因为我还是个新手,但谢谢你的评论,这让我思考了一下。你不希望日期作为列名。这表明存在一些严重的规范化问题。既然你说了52,我猜你想要一年中每周的数据?通常,每周都是表中的一行,而不是另一列。