11
votes

ALTER TABLE MY_TABLE AJOUTER @COLUMN INT

Si je veux utiliser une variable comme nom de la nouvelle colonne, est-ce que cela possible dans MS SQL?

Exemple qui ne fonctionne pas: P>

EXEC ('ALTER TABLE my_table ADD ' + @column + ' INT')


3 commentaires

Quelle est l'erreur sa donnée?


@MAHESH VELAGA: Le message d'erreur est hors de propos. C'est simplement une syntaxe incorrecte pour l'énoncé de table alter


Désinfecter votre variable (@column) avant de faire cela ... C'est très essentiel ou vous regretterez plus tard


3 Réponses :


19
votes

Ceci est possible à l'aide de Dynamic SQL pour créer votre DDL et à l'aide de la commande exécutant pour exécuter la chaîne. xxx

voir Cet article article.

Je vais également ajouter que le moment où vous vous aventurez Au Terre de Dynamic SQL, vous devez prendre soin de ne pas vous exposer à Attaques d'injection SQL . Nettoyez toujours les paramètres à venir.

Comme Philip mentionne - réfléchissez longtemps et difficile avant de le faire. Le fait qu'il soit possible ne fait pas une bonne chose ...

Erland Sommarskog a écrit un vaste article sur l'utilisation dynamique SQL - la malédiction et les bénédictions de SQL dynamique que je recommande de lire complètement.


3 commentaires

Assurez-vous également que la valeur de la variable est désinfectée pour les erreurs et l'injection SQL.


... Mais ce n'est pas une idée particulièrement bonne, comme vous pouviez vous retrouver avec des colonnes nommées des mots réservés (colonne "colonne") ou (frissonnant) contenant des espaces incorporés. Pensez long et dur avant de faire ça!


Je trouve souvent que l'utilisation d'Exec est le premier signe que je suis éteint dans les mauvaises herbes. Mais parfois c'est le meilleur des alternatives médiocres



1
votes

Regardez ( Exécuter (transact-sql) )

CREATE TABLE MyTable(
        ID INT
)
GO
SELECT * FROM MyTable
GO
DECLARE @column VARCHAR(100)
SET @column = 'MyNewCol'
EXEC('ALTER TABLE MyTable ADD ' + @column + ' INT')
GO
SELECT * FROM MyTable
GO
DROP TABLE MyTable


0 commentaires

1
votes
alter procedure sp_check_table_column
(
    @field_name varchar(max),
    @data_type varchar(max),
    @mandatory varchar(max)
)
as
if not exists (select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = '<table_name>' and COLUMN_NAME = @field_name)
begin
 declare @sql varchar(max)
 set @sql = ('ALTER TABLE <table_name> ADD ' + @field_name + ' ' + @data_type + ' ' + @mandatory)
 exec (@sql) 
end

0 commentaires