Как создать / добавить столбцы, используя переменную в цикле

Я очень новичок в SQL в том, что я только что закончил читать Sams Teach Yourself SQL за 10 минут, и это мое единственное знание 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 бросить его как символ, но СУБД рада сообщить мне, что есть Incorrect syntax near '@curr_date' в этой последней строке (строка ADD), потому что мне не нравится, что я пытаюсь назвать столбец с локальной переменной (я думаю). У меня нет примера вывода, но выводом должна быть таблица с первым столбцом, определенным как CHAR и озаглавленным emp_name потому что он будет содержать имена. Все остальные столбцы определены как тип DOUBLE и должно быть NULL потому что они будут держать количество часов и должны иметь текущую дату в качестве заголовка @curr_date, Я думаю, что все столбцы добавляются в таблицу через ALTER метод по умолчанию NULL в любом случае. Я видел примеры динамического SQL, где вы объявляете переменную для хранения оператора select, но я не совсем понимаю, как они добавляют столбцы в таблицу. Я не уверен, что это можно сделать в CREATE заявление, но если это возможно, было бы здорово увидеть. Кроме того, это должно быть переменной в том, что я мог бы изменить @end_date чтобы сказать... они год 2046.

Безопасность здесь не проблема

1 ответ

Решение

Я согласен со всеми комментариями об использовании строк, не добавляя столбцы динамически, вы всегда можете динамически поворачивать эти последние, и это будет более гибко. Так что, возможно, некоторые соображения схемы, но просто чтобы ответить на ваш конкретный вопрос, вы где близко.....

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
Другие вопросы по тегам