2016-09-02 1 views
2

J'ai créé une procédure stockée qui actualise les données d'une table. Il commence par recharger toute la table. Ensuite, plusieurs filtres sont appliqués. (Exemple: la colonne 'Modèle' doit égaler 'W', toutes les lignes avec le modèle 'B' sont supprimées.) Cela se produit après le chargement de la table (et pas pendant) parce que je veux enregistrer le nombre de lignes supprimées chaque filtre individuel. Une fois les filtres appliqués, certaines colonnes contiennent la même valeur dans chaque ligne (les autres valeurs ont été supprimées dans le processus de filtrage). Ces colonnes sont maintenant inutiles, donc je veux les supprimer.La procédure stockée refuse de supprimer la colonne qu'elle crée

Cela semble être problématique pour SQL Server. Lorsqu'on lui donne la commande pour exécuter le SP, cela indique que les colonnes qu'il est censé supprimer dans son étape finale n'existent pas actuellement et refusent de s'exécuter. C'est techniquement correct, les colonnes n'existent pas actuellement, mais elles seront créées par le SP lui-même.

Certains Code mockup:

CREATE PROCEDURE dbo.Procedure AS (
    DROP TABLE dbo.Table 
    SELECT * INTO dbo.Table FROM dbo.View 
    INSERT INTO dbo.Log VALUES (GETDATE(),(SELECT COUNT(1) FROM dbo.Table)) 
    DELETE FROM dbo.Table WHERE Model <> 'W' 
    INSERT INTO dbo.Log VALUES (GETDATE(),(SELECT COUNT(1) FROM dbo.Table)) 
    ALTER TABLE dbo.Table DROP COLUMN Model 
) 

Code d'erreur lors de l'exécution:

[2016-09-02 12:25:20] [S0001][207] Invalid column name 'Model'. 

Comment puis-je contourner ce problème et obtenir le SP à courir?

+0

La raison de l'erreur est que parce que 'dbo.Table' existe, mais sans la colonne' Model ', lorsque le proc est compilé. L'instruction 'ALTER TABLE' est validée par rapport au schéma sans la colonne et échoue. Envelopper l'instruction alter dans SQL dynamique évitera le problème car l'instruction sera alors compilée séparément, immédiatement avant l'exécution. –

+0

@A. Stam: modifiez votre script avec la syntaxe correcte 'ALTER TABLE dbo.Table *** DELETE *** COLUMN Model' vers ALTER TABLE dbo.Table *** DROP *** COLUMN Modèle –

Répondre

2

Si je comprends bien, vous pouvez utiliser SQL dynamique:

exec sp_executesql 'ALTER TABLE dbo.Table DROP COLUMN Model'; 
+0

Ceci compile sans erreurs. Je suis en train de tester la procédure maintenant pour vérifier le résultat. –

+0

La procédure fonctionne bien maintenant. Cependant, j'ai dû formater la requête comme suit: 'DECLARE @sql nvarchar (100) = 'ALTER TABLE dbo.Table DROP COLUMN Modèle'; EXEC sp_executesql @ sql'. Pour une raison quelconque, sp_executesql n'accepterait pas simplement la chaîne comme un argument comme dans votre exemple. –

0

Pouvez-vous vérifier une fois de plus pour la existency de la colonne « modèle » existe dans la vue.

parce que je l'ai essayé avec le même scénario et ses œuvres pour moi ..

enter image description here

+0

La colonne 'Modèle' existe dans la vue. Si vous réexécutez votre script, cela fonctionne-t-il toujours? La première fois que le script est exécuté, cela devrait fonctionner, car vous n'avez peut-être pas déjà supprimé les colonnes de la table. –

+0

@ A. Stam: chaque fois que la table est tombée et recréée à droite ?? il n'est pas mentionné que VIEW a une dépendance avec la table. Donc il n'y aura pas de problème .. –

1

Syntaxe pour supprimer toute colonne de la table dans SQL Server est

ALTER TABLE TableName DROP COLUMN ColumnName ; 

Cela peut être cause de problème.

+0

C'était une faute de frappe dans la question, merci de le remarquer. Ma syntaxe est correcte dans la procédure. –