如何在循环中使用变量 create/add 列
How to create/add columns using a variable in a loop
我对 SQL 很陌生,因为我刚刚读完 Sams Teach Yourself SQL in 10 Minutes,这是我唯一的 SQL 知识。所以现在我已经完成了这本书,我正在尝试创建一些 table 以便我可以使用它们。我可以轻松地创建一个具有已知数量的列并指定 header 的 table。我遇到麻烦的地方是创建一个 table,其中包含未知数量的列和日期作为 header。到目前为止我尝试过的是:
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
我在这里尝试做的是为循环设置起点和终点,并使用存储在局部变量中的循环条件作为我的列 header 因为这就是我需要的列标题。我还尝试使用 CAST
将其转换为 char 但 DBMS 很高兴地告诉我最后一行(ADD 行)有 Incorrect syntax near '@curr_date'
因为它不喜欢我'我试图用局部变量命名列(我认为)。我没有示例输出,但输出应该是 table,第一列定义为 CHAR,标题为 emp_name
,因为它将包含名称。所有其他列定义为 DOUBLE
类型并且应该是 NULL
,因为它们将保存几个小时并且必须将当前日期设为 header @curr_date
。我认为通过 ALTER
方法添加到 table 的所有列都默认为 NULL
。我看过动态 SQL 的示例,您可以在其中声明一个变量来保存 select 语句,但我真的不明白它们如何向 table 添加列。我不确定这是否可以在 CREATE
语句中完成,但如果可以的话,那就太好了。此外,这需要可变,因为我可以将 @end_date
更改为……他们是 2046 年。
这里安全不是问题
我同意所有关于使用 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
我对 SQL 很陌生,因为我刚刚读完 Sams Teach Yourself SQL in 10 Minutes,这是我唯一的 SQL 知识。所以现在我已经完成了这本书,我正在尝试创建一些 table 以便我可以使用它们。我可以轻松地创建一个具有已知数量的列并指定 header 的 table。我遇到麻烦的地方是创建一个 table,其中包含未知数量的列和日期作为 header。到目前为止我尝试过的是:
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
我在这里尝试做的是为循环设置起点和终点,并使用存储在局部变量中的循环条件作为我的列 header 因为这就是我需要的列标题。我还尝试使用 CAST
将其转换为 char 但 DBMS 很高兴地告诉我最后一行(ADD 行)有 Incorrect syntax near '@curr_date'
因为它不喜欢我'我试图用局部变量命名列(我认为)。我没有示例输出,但输出应该是 table,第一列定义为 CHAR,标题为 emp_name
,因为它将包含名称。所有其他列定义为 DOUBLE
类型并且应该是 NULL
,因为它们将保存几个小时并且必须将当前日期设为 header @curr_date
。我认为通过 ALTER
方法添加到 table 的所有列都默认为 NULL
。我看过动态 SQL 的示例,您可以在其中声明一个变量来保存 select 语句,但我真的不明白它们如何向 table 添加列。我不确定这是否可以在 CREATE
语句中完成,但如果可以的话,那就太好了。此外,这需要可变,因为我可以将 @end_date
更改为……他们是 2046 年。
这里安全不是问题
我同意所有关于使用 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