我对SQL很新,因为我刚读完Sams Teach Yourself SQL in 10 Minutes,这是我唯一的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
我在这里尝试做的是为循环创建一个起点和终点,并使用存储在局部变量中的循环条件作为我的列标题,因为这就是我需要标题的列。我也尝试使用CAST
将其转换为char,但DBMS很高兴地告诉我最后一行(ADD行)上有Incorrect syntax near '@curr_date'
因为它不喜欢我'我试图用局部变量命名一个列(我想)。我没有示例输出,但输出应该是一个表,第一列定义为CHAR,标题为emp_name
,因为它将保存名称。所有其他列定义为DOUBLE
类型,并且应为NULL
,因为它们将持有若干小时,并且必须将当前日期作为标题@curr_date
。我认为通过ALTER
方法添加到表中的所有列都默认为NULL
。我已经看到动态SQL的例子,你声明一个变量来保存select语句,但我真的不明白它们如何向表中添加列。我不确定这是否可以在CREATE
声明中完成,但是如果能够做到这一点会很棒。此外,这需要变化,因为我可以将@end_date
改为让他们说......他们是2046年。
安全性不是问题
答案 0 :(得分:1)
我同意所有关于使用ROW而不是动态添加列的注释,你总是可以动态地调整后者,它会更灵活。所以也许是一些模式考虑因素,但只是为了回答您关注的具体问题.....
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