Как создать / добавить столбцы, используя переменную в цикле
Я очень новичок в 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