Ich versuche eine Funktion nach meinen Anforderungen zu erstellen.
Wenn Sie jedoch #tempTable
erstellen oder löschen, wird ein Fehler wie folgt angezeigt:
ungültige Verwendung eines Seiteneffekt-Operators 'Drop-Objekt' innerhalb einer Funktion
Mein Verständnis ist, dass wir create
, drop
oder insert
Operationen auf #temptable
in einer Funktion nicht haben können.
Stimmt das?
Mein SQL:
%Vor%Das ist richtig - Sie können keine Nebensätze haben:
Von hier: Ссылка
Die Anweisungen in einem BEGIN ... END-Block können keine Nebenwirkungen haben. Funktionsseiteneffekte sind permanente Veränderungen des Zustandes eines Ressource, die einen Bereich außerhalb der Funktion hat, z. B. eine Änderung zu einer Datenbanktabelle. Die einzigen Änderungen, die von der Anweisungen in der Funktion sind Änderungen an lokalen Objekten Funktion wie lokale Cursor oder Variablen. Änderungen an Datenbanktabellen, Operationen mit Cursorn, die nicht lokal zu den Funktion, E-Mail senden, eine Katalogänderung versuchen und Das Generieren einer Ergebnismenge, die an den Benutzer zurückgegeben wird, sind Beispiele für Aktionen, die nicht in einer Funktion ausgeführt werden können.
Was Sie selbst ohne Ihre DROP
-Anweisung finden würden, ist, dass jeder Versuch, auf eine temporäre Tabelle zuzugreifen, Ihnen die Nachricht gibt (zB SELECT ... INTO #TMP
):
Kann nicht auf temporäre Tabellen innerhalb einer Funktion zugreifen
Wie @Dems herausfindet, können Sie Tabellenvariablen verwenden. Da es sich um Variablen handelt, sind sie innerhalb der Funktion beschränkt und wirken daher nicht nebensächlich.
Ihre Funktion läuft möglicherweise wie folgt:
%Vor%Nicht getestet oder so, aber Sie erhalten das Wesentliche.
Ich habe keine Ahnung, warum Sie eine #temp-Tabelle in dieser Funktion benötigen oder warum es eine TVF mit mehreren Anweisungen ist. Das Folgende wird viel effizienter sein (obwohl ich den Zweck des Parameters @Id
nicht verstehe):
Wie Jon sagte, denke ich könnte es auch wie folgt umgeschrieben werden, und es ist eigentlich so, wie ich angefangen habe es zu schreiben, aber ich habe keine Möglichkeit zu bestätigen, ob einer von diesen tatsächlich den zurückgibt Daten, die Sie zurückgeben möchten:
%Vor%Tags und Links sql-server function