2012-02-28 4 views
0

Есть ли способ добавить столбец в таблицу, но я хочу, чтобы заголовок был датой, и каждый новый добавленный столбец будет иметь заголовок столбца на следующий день,SQL Server 2008 ALTER TABLE добавить столбец со специальным столбцом

SET @date1 = @date1 + 1 

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

StoreID StoreName  02/01/12 03/01/12 04/01/12 
1234 Coles1   7512  8574   
1235 Coles2   7210  8441 
1236 Coles3   4845  5448 

Когда я запускаю сценарий, я получаю следующее сообщения об ошибках:

Msg 170, Level 15, State 1, Line 1
Строка 1: Неверный синтаксис рядом с '@Column'.
Msg 170, Level 15, State 1, Line 1
Линия 1: Неправильный синтаксис рядом с полем «Колонна».

Вот мой сценарий:

DECLARE @date datetime 
DECLARE @date1 datetime 
DECLARE @date2 datetime 
DECLARE @Column varchar(8) 
SET @date = '02 Jan 2012' 
SET @date1 = '02 Jan 2012' 
SET @date2 = '08 Jan 2012' 
SET @Column = CONVERT(VARCHAR(8), @date1, 3) 

IF NOT EXISTS (SELECT * FROM sysobjects WHERE xtype = 'U' AND name = '#vl_temp_trans') 
BEGIN 
    CREATE TABLE #vl_temp_trans 
     (StoreID INT, 
     StoreName VARCHAR(100), 
     @Column MONEY)     ----> column name to be date "@Column) 
END 

WHILE (@date1 <= @date2) 
BEGIN 
    SET @Column = CONVERT(VARCHAR(8), @date1, 3) 

    ALTER table #vl_temp_trans 
    ADD @Column MONEY  ----> column name to be date "@Column" 

    Insert into #vl_temp_trans (storeID, storeName, @Column) 
     select storeId, storeName, TotalDailyTransactions 
     from daily_trans t1 (nolock) 
     full outer join outlets t2 (nolock) on t1.StoreID = t2.StoreID 
     where DailyEnd = @date1 + 1 

    SET @date1 = @date1 + 1 
END 
+0

Знаете ли вы, почему я внес изменения в ваш вопрос? Почему вы отменили их? –

+1

Также форматирование и читаемость в стороне, в какой таблице есть столбцы «TotalDailyTransactions» и «DailyEnd»?Почему ни один из ваших столбцов не префикс с их псевдонимом таблицы, чтобы избежать неоднозначных ошибок имени столбца (и вопросов от нас)? –

+0

проверьте обновленный код ..., который может решить вашу проблему ..... –

ответ

0

Я думаю, что проблема в том, что вы не можете использовать переменную, чтобы определить имя столбца.

Я использовал часть вашего кода для тестирования. Эта первая часть выполнена отлично.

DECLARE @date1 datetime 
DECLARE @Column varchar(8) 
SET @date1 = '02 Jan 2012' 
SET @Column = CONVERT(VARCHAR(8), @date1, 3) 
select @Column 

Но когда я добавил CREATE TABLE заявление и выполняются все это сразу, то я получил ту же ошибку вы сделали.

CREATE TABLE #vl_temp_trans 
(StoreID INT, 
StoreName VARCHAR(100), 
@Column MONEY)     ----> column name to be date "@Column) 

Для этого вам нужно будет наращивать CREATE TABLE и ALTER TABLE заявления в виде строки, а затем выполнить те, которые используют EXECUTE или sp_executesql. A search for "dynamic sql" также предоставит вам статью, в которой также описывается это.

0

Существует две вещи, которые нужно сделать, чтобы выполнить этот код ...

  1. Создание динамического использования SQL сделать из SP_ExecuteSQl
  2. вам нужно сделать вашу временную таблицу Gobal, потому что при создании собственной временной таблицы он остается в рамках dyanic Sql зр только

имеют вид на ниже код, который обновляется мной уверен reslove ваш вопрос

DECLARE @date datetime 
DECLARE @date1 datetime 
DECLARE @date2 datetime 
DECLARE @ColumnNAAME varchar(8) 
Declare @Query NVARCHAR(1000) 
DECLARE @ParmDefinition NVARCHAR(500); 


SET @date = getdate() 
SET @date1 = getdate() 
SET @date2 = getdate() 
SET @ColumnNAAME = CONVERT(VARCHAR(8), @date1, 3) 
IF NOT EXISTS (SELECT * FROM sysobjects WHERE xtype = 'U' AND name = '#vl_temp_trans')  
BEGIN  
SET @ParmDefinition = N'@Column varchar(8)'; 
Set @Query = 'CREATE TABLE ##vl_temp_trans (StoreID INT,  StoreName VARCHAR(100),  ['[email protected]+'] MONEY)' 

EXECUTE sp_executesql @Query,@ParmDefinition, 
         @Column = @ColumnNAAME; 

       ----> column name to be date "@Column)  
SELECT * from ##vl_temp_trans 

END 
ELSE 
BEGIN 
    SELECT * from ##vl_temp_trans 
END 
+0

Привет, Спасибо за ваш ответ, но имя столбца не показывает дату, оно показывает @column. – HL8

+0

Кроме того, я настоятельно рекомендую против глобальных временных таблиц ##, если вы действительно не хотите, чтобы параллелизм = 1 (и может каким-то образом его применять), или вы не возражаете, чтобы два пользователя смешали свои результаты вместе. –

+0

Эй, пожалуйста, проверьте сейчас –

2

Вы не можете сделать это без динамического SQL. Вот запрос, который даст вам результат, который вы хотите. Вы более чем можете расколоть бит --INTO #t, однако неясно, что вы хотите сделать с таблицей #temporary за ее пределами (если вы сообщите нам конечный результат, вместо «Я хочу добавить имя столбца как @column, может быть, мы можем помочь с этим тоже) для того, чтобы продолжить эту таблицу ссылок #T, вам необходимо продолжать использовать код в той же области. -. это означает больший динамический SQL, который выполняется в пределах одного sp_executesql вызова

DECLARE 
    @start DATE = '2012-01-02', 
    @end DATE = '2012-01-08'; 

DECLARE 
    @sql  NVARCHAR(MAX) = N'', 
    @colMax NVARCHAR(MAX) = N'', 
    @colNames NVARCHAR(MAX) = N''; 

;WITH x(rn) AS (SELECT TOP (DATEDIFF(DAY, @start, @end) + 1) ROW_NUMBER() 
    OVER (ORDER BY [object_id]) - 1 FROM sys.all_columns), 
y(d) AS (SELECT CONVERT(CHAR(10), DATEADD(DAY, rn, @start)) FROM x 
) 
SELECT @colMax += N',' + CHAR(13) + CHAR(10) 
    + QUOTENAME(d) + ' = SUM(CASE WHEN DailyEnd = ''' 
    + d + ''' THEN TotalDailyTransactions ELSE 0 END)', 
    @colNames += N',' + QUOTENAME(d) FROM y; 

SET @sql = 'SELECT StoreID, StoreName, ' + STUFF(@colNames, 1, 1, '') 
    + ' --INTO #t 
     FROM (SELECT StoreID, StoreName, ' + STUFF(@colMax, 1, 1, '') 
    + ' FROM dbo.daily_trans 
     WHERE DailyEnd >= ''' + CONVERT(CHAR(10), @start) + '''' 
    + ' AND DailyEnd < ''' + CONVERT(CHAR(10), DATEADD(DAY, 1, @end)) + ''' 
     GROUP BY StoreID, StoreName 
     UNION ALL SELECT StoreID, StoreName, ' + STUFF(@colMax, 1, 1, '') 
    + ' FROM dbo.outlets 
     WHERE DailyEnd >= ''' + CONVERT(CHAR(10), @start) + '''' 
    + ' AND DailyEnd < ''' + CONVERT(CHAR(10), DATEADD(DAY, 1, @end)) + ''' 
     GROUP BY StoreID, StoreName) AS x'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 
+0

Привет, Аарон, спасибо за вашу помощь, но у меня есть следующие сообщения об ошибках: Msg 139, Level 15, State 1, Line 2 Невозможно присвоить значение по умолчанию локальной переменной. Msg 170, уровень 15, состояние 1, строка 2 Строка 2: неправильный синтаксис около 'MAX'. Msg 170, Level 15, State 1, Line 2 Line 2:.. Неправильный синтаксис около '(' Msg 137, Level 15, состояние 2, строка 2 Необходимо объявить переменную '' @start Msg 137, Level 15, State 2, Line 2 Должен объявить переменную '@colMax'. Msg 137, уровень 15, состояние 2, строка 2 Должен объявить переменную '@colNames'. Msg 137, уровень 15, состояние 2, строка 2 Должен объявить переменную '@sql'. – HL8

+1

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

+0

Я просто запустил его как есть. – HL8

Смежные вопросы