Erstellt, löscht und fügt eine temporäre Tabelle in eine benutzerdefinierte Funktion ein

7

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%     
Software Enginner 29.06.2012, 19:26
quelle

3 Antworten

19

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.

    
Jon Egerton 29.06.2012, 19:34
quelle
2

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):

%Vor%

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%     
Aaron Bertrand 29.06.2012 20:49
quelle
0

Entfernen Sie # statt @ Ich habe keinen anderen Aspekt getestet

    
user3231262 24.01.2014 08:51
quelle

Tags und Links