2015-01-15 10 views
5

Utilizzo Microsoft SQL Server e sembra che non riesca a risolvere il problema.SQL Server: drop column @variable not working

Ho una tabella in cui avrò alcune colonne dinamiche e statiche.

Le colonne statiche dovrebbero essere il nome del prodotto, il tipo di prodotto e i dati dinamici sarebbero dati di produzione da mesi in corso.

A ogni inizio del mese devo eliminare dalle colonne dinamiche mese passato e aggiungere un nuovo mese alla fine della tabella

La mia soluzione era di salvare il nome della colonna in una variabile locale e quindi aggiungendolo alla dichiarazione alter. Ma questo non funziona, si continua a darmi un errore come sotto:

Msg 102, livello 15, stato 1, riga 18
la sintassi non corretta in prossimità '@month_b'

Passo ora aggiungi le domande

declare @month_t char(15) 
declare @month_b char(15) 
declare @sql char(30) 

set @month_b = (SELECT top 1 name 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID('dbo.ct_test') 
        AND name != 'TTNR' AND name != 'Family' AND name like '%B%' 
       ORDER BY name ASC) 

set @month_t = (SELECT top 1 name 
       FROM sys.columns 
       WHERE object_id = OBJECT_ID('dbo.ct_test') 
        AND name != 'TTNR' AND name != 'Family' AND name like '%T%' 
       ORDER BY name ASC) 

alter table ct_test 
    drop column @month_b 

Non riesco a trovare una soluzione a questo, puoi aiutarmi.

Grazie in anticipo

+0

Questo non sembra un buon design, btw. Aggiungendo e rilasciando regolarmente le colonne è un odore di codice per me. –

risposta

4

È necessario utilizzare Dynamic Query

Declare @sql nvarchar(max) 

set @sql = 'alter table ct_test drop column '+ @month_b 

Exec sp_executesql @sql 

set @sql = 'alter table ct_test drop column '+ @month_t 

Exec sp_executesql @sql 
+0

Mi dà un altro errore: messaggio 214, livello 16, stato 2, procedura sp_execute, riga 1 La procedura prevede il parametro '@handle' di tipo 'int'. –

+0

@CaluserIstvan - mi spiace che dovrebbe essere 'sp_executesql' invece di' sp_execute'. Controllo aggiornato ora –

+0

Grazie mille, funziona !! –