2010-07-05 4 views
11

Ich habe einen Fehler erhalten "Text-, Ntext- oder Bildspalten in den Tabellen' eingefügt 'und' gelöscht 'nicht möglich sind ntext Felder in der Originaltabelle, an die ich einen Trigger angehängt habe. HierDie Spalten text ',' ntext 'oder' image 'in den Tabellen' insert 'und' deleted 'können nicht verwendet werden

ist eine Lösung: http://lazycodeprogrammer.blogspot.com/2009/08/how-to-use-inserteddeleted-with.html

Aber ursprüngliche (nicht modifiziert) Abfrage ist komplex genug. Was sollte ich anstelle von SELECT * FROM INSERTED mit JOIN-Operator schreiben, wie es empfohlen wird?

+0

Was willst du tun? Können Sie uns Ihren Auslöser zeigen (zumindest die relevantesten Teile davon)? Deine Frage ist nicht sehr klar .... –

+0

Ich versuche eingefügte Zeilen innerhalb meines Triggers zu bekommen. Wenn ich die Abfrage "SELECT * FROM INSERTED" ausführe, bekomme ich "Kann nicht Text, Ntext oder Bild Spalten in den 'eingefügt' und 'gelöscht' Tabellen Fehler. Ich weiß warum: Weil die Originaltabelle das Feld ntext enthält. Wie soll ich meine Abfrage ändern, um dies zu umgehen? – noober

+0

@noober, ohne dass Sie irgendeine SQL zeigen, kann jeder sagen, dass Sie nur implementieren, was Sie in Ihrem Link selbst gepostet haben. –

Antwort

8

Eine schöne Lösung gefunden wurde:

  1. SELECT FROM INSERTED- nur id-Spalte (es Ntext oder Bild und Abfrage ausgeführt wird ist nicht).
  2. SELECT aus der Originaltabelle * mit den gleichen IDs.
  3. Verwenden Sie bei Bedarf die Option UPDATED() bei INSERTED, um festzustellen, welche Spalten geändert wurden.
+3

Das ist eigentlich keine so schöne Lösung. Während es mit eingefügter Tabelle OK funktioniert, mit gelöschter Tabelle ist diese Annäherung falsch, da Sie Werte nach Aktualisierung, nicht vor Aktualisierung erhalten werden. – buhtla

13

Das eigentliche Problem ist, Sie versuchen, Spalten in der Tabelle eingefügt auszuwählen, die vom Typ ntext, Text oder Bild ist. Dies ist in einem Trigger nicht erlaubt.

Die wirkliche Lösung wäre, alle Ihre Ntext, Nvarchar (Max), Text zu Varchar (Max) und Bild zu Varbinary (Max) wie von MS vorgeschlagen ändern.

MS besagt, dass diese Typen veraltet sind und in zukünftigen Versionen entfernt werden.

Auch Ntext sind wirklich langsam als Leistung, da es keine In-Zeile-Daten gibt.

+4

LOL. Nun, das wirkliche Problem ist dann, MS sagen uns "diese Typen sind veraltet und werden in der zukünftigen Version entfernt werden, bla-bla-bla", aber sie benutzen sie selbst. Rate wo? In der SharePoint-Datenbank. Und ich muss wissen, welche Zeilen geändert werden und welche Felder trotz NTEXTs weit und aktiv zum Speichern von Listen verändert werden. Ich weiß, was du sagen wirst: "Benutze DB nicht direkt, benutze stattdessen OM". Bitte nicht. Ich habe das ganze letzte Jahr die beschissene OM während mehrerer Projekte erkundet, Leistung und Funktionsumfang, die ich will, sind nur auf DB-Ebene verfügbar. – noober

1

Die Verwendung von "INSTEAD OF" Triggern kann das Problem lösen, da die Felder text, ntext und image in den Tabellen "insert" und "deleted" verfügbar sind. Schauen Sie sich http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=148387 an, um zu sehen, wie es gemacht werden kann.

0

Verwenden Sie den folgenden Trigger nach Einsatz auf yourtable:

SELECT textfields 
FROM yourtable 
WHERE EXISTS (
    SELECT 1 
    FROM {inserted/deleted} 
    WHERE {inserted/deleted}.PK = {yourtable}.PK 
) 
Verwandte Themen