Beim Erstellen einer gespeicherten Prozedur in SQL Server dürfen Sie auf Tabellen verweisen, die nicht vorhanden sind. Wenn die Tabelle jedoch vorhanden ist, muss jede Spalte, auf die Sie in der Prozedur verweisen, in dieser Tabelle vorhanden sein ( Auflösung des verzögerten Namens ).
Ist es möglich, SQL Server anzuweisen, die Namensauflösung aller Tabellen, auf die in einer Prozedur verwiesen wird, zu verschieben, unabhängig davon, ob sie vorhanden sind oder nicht? Ich möchte die allgemeine Syntaxprüfung beibehalten. Selbst wenn dies möglich wäre, ist das Hacken der Definition der gespeicherten Prozedur in eine Systemtabelle keine Option.
Ich gehe davon aus, dass meine Aufforderung dazu etwas seltsam erscheint. Hier einige Hintergrundinformationen: Ich generiere automatisch Tabellendefinitionen und gespeicherte Prozeduren aus einer in C # geschriebenen Anwendung, und es ist sehr schwierig für mich, den Code zu ändern, um die Änderungen nach SQL zu ordnen Sie. Mein Code "garantiert", dass das Schema innerhalb einer Transaktion konsistent ist, aber derzeit kann ich nicht garantieren, dass die Tabellenspalten definiert sind, bevor ich die gespeicherte Prozedur definiere, die auf sie verweist.
Unten finden Sie ein kanonisches Beispiel für das von C # erstellte SQL, das das Problem "veranschaulicht", das ich zu lösen versuche.
--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
Es ist mir möglich, dies im C # -Code zu beheben, aber ich hoffe auf eine einfache "magische" Optimierung, die ich in SQL durchführen kann. Das spart mir viel Zeit.
quelle
Antworten:
Nein.
Ich fühle mich wirklich schuldig, wenn ich das schreibe, aber nein, leider. Das ist das erste Mal, dass ich von diesem Anwendungsfall gehört habe, und es macht vollkommen Sinn. Am besten senden Sie eine Anfrage auf http://connect.microsoft.com, und Ihre Enkelkinder können dies tun. ;-);
quelle
Nur für den Fall, dass Sie immer noch interessiert sind, gibt es eine mögliche Problemumgehung, die Sie anwenden können. Hier ist der aktualisierte Code, der die
#deferResolution
temporäre Tabelle in jede Abfrage in der Prozedur einführt . Da die temporäre Tabelle nur zur Laufzeit vorhanden ist, kann die Prozedur kompiliert werden, obwohl die richtigen Spalten noch nicht vorhanden sindmyTable
.Sie erhalten sogar den gleichen Ausführungsplan (kein Verweis auf die
#deferResolution
Tabelle) für jede Anweisung in der Prozedur, da das Abfrageoptimierungsprogramm nachweisen kann, dass diesWHERE NOT EXISTS
immer als wahr ausgewertet wird.Alles in allem ist dies ein schrecklicher Hack, der hauptsächlich aus intellektuellen Gründen präsentiert wird, und es könnte einen Randfall geben, in dem er zusammenbricht. Wie Aaron erwähnt, ist es wahrscheinlich besser, alle Schemaänderungen in der richtigen Reihenfolge vorzunehmen.
quelle