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?
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. –
@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 –