Lors de la création d'une procédure stockée dans SQL Server, vous êtes autorisé à faire référence à des tables qui n'existent pas. Mais, si la table existe, alors toute colonne à laquelle vous faites référence dans la procédure doit exister dans cette table ( résolution de nom différée ).
Est-il possible de demander à SQL Server de différer la résolution de noms de toutes les tables référencées dans une procédure, qu'elles existent ou non? Je veux garder la vérification de la syntaxe générale, donc même si c'était possible, pirater la définition de procédure stockée dans une table système n'est pas une option.
Je m'attends à ce que ma demande de faire cela puisse sembler un peu bizarre , alors voici un peu de contexte: je génère automatiquement des définitions de table et des procédures stockées à partir d'une application écrite en C # et il est très difficile pour moi de changer le code pour ordonner les changements selon les besoins de SQL leur. Mon code "garantit" que le schéma est cohérent dans une transaction, mais actuellement je ne peux pas garantir que les colonnes de la table sont définies avant de définir la procédure stockée qui les référence.
Ci-dessous est un exemple canonique du SQL créé par le C # qui "illustre" le problème que j'essaie de résoudre.
--Say this table already exists.
CREATE TABLE myTable
(
a NVARCHAR(MAX)
)
GO
--My C# code creates something like this
BEGIN TRAN
GO
--the stored procedure gets generated first.
CREATE PROCEDURE mySproc
AS
BEGIN
SELECT a,b FROM myTable
END
--then the table update
ALTER TABLE myTable
ADD b nvarchar(MAX)
COMMIT TRAN
Il est possible pour moi de résoudre ce problème dans le code C #, mais j'espère un simple ajustement "magique" que je peux tirer dans le SQL. Cela me fera gagner beaucoup de temps.
la source
Réponses:
Non.
Je me sens vraiment coupable de taper ça, mais non, malheureusement. C'est la première fois que j'entends parler de ce cas d'utilisation, et c'est parfaitement logique. Mieux vaut en faire la demande sur http://connect.microsoft.com et vos petits-enfants pourront le faire. ;-)
la source
Au cas où vous seriez toujours intéressé, il existe une solution de contournement potentielle que vous pouvez utiliser. Voici le code mis à jour, qui présente la
#deferResolution
table temporaire à chaque requête de la procédure. Étant donné que la table temporaire n'existera qu'au moment de l'exécution, la procédure est capable de compiler même si les colonnes appropriées n'existent pas encore surmyTable
.Vous obtiendrez même le même plan d'exécution (aucune référence à la
#deferResolution
table) pour chaque instruction de la procédure en raison de la façon dont l'optimiseur de requêtes peut prouver que cela estWHERE NOT EXISTS
toujours vrai.Cela dit, il s'agit d'un terrible piratage présenté principalement pour un intérêt intellectuel et il pourrait y avoir un cas limite où il tombe en panne. Comme Aaron le mentionne, vous feriez probablement mieux de faire tous vos changements de schéma dans le bon ordre.
la source