SQL Server Fehlermeldungen

  • InsideSQL.org home
  • Kontakt
  • Anmelden
  • « 243: Der %1!-Typ ist kein definierter Systemtyp.
  • 235: Ein char-Wert kann nicht in einen money-Wert konvertiert werden. »

240: Die Typen stimmen zwischen dem Anker und dem rekursiven Teil

posted on Nov 30, 2010 von Frank Kalis in 0 - 999

Fehlermeldung:
Meldung 240, Ebene 16, Status 1, Zeile 1
Die Typen stimmen zwischen dem Anker und dem rekursiven Teil in der "%1!"-Spalte der rekursiven Abfrage "%2!" nicht überein.

Ebene:
16.

Beschreibung:
Diese Fehlermeldung erscheint, wenn die Datentypen einer Spalte zwischen dem Anker und dem rekursiven Teil einer Common Table Expression nicht kompatible sind.

Auswirkungen:
Das SQL Statement kann zwar geparst werden, jedoch zur Laufzeit wird der Fehler ausgelöst.

Behebung:
Fehler der Ebene 16 sind Fehler, die vom Anwender hervorgerufen werden. Sie können und müssen vom Anwender korrigiert werden. Das Statement kann so nicht ausgeführt werden. Die Datentypen müssen übereinstimmen.

Versionen:
Diese Fehlermeldung wurde mit SQL Server 2005 eingeführt.

Beispiele:
USE tempdb;
GO
IF OBJECT_ID('tempdb..#t') > 0
 DROP TABLE #t
GO
CREATE TABLE #t
(
 id INT,
 reportToID INT NULL,
)
INSERT INTO #t SELECT 1, NULL
UNION ALL SELECT 2, 1
UNION ALL SELECT 3, 1
UNION ALL SELECT 4, 2
GO
WITH MyCTE (id, reportToID, Level)
AS
(
 SELECT t1.ID, t1.reportToID, CAST(0 AS INT) AS Level
   FROM #t AS t1
  WHERE reportToID IS NULL
  UNION ALL
 SELECT t1.ID, t1.reportToID, CEILING(Level * RAND()) AS Level
   FROM #t AS t1
   JOIN MyCTE AS t2
     ON t1.reportToID = t2.ID
)
SELECT *
  FROM MyCTE
GO

Anmerkungen:
Im obigen Beispiel wird versucht die Level Spalte im Anker und in rekursiven Teil der CTE als INT Typ interpretieren zu lassen. Dies löst den Fehler aus. Um den Fehler zu vermeiden, muss die CTE folgendermassen umformuliert werden:

USE tempdb;
GO
IF OBJECT_ID('tempdb..#t') > 0
 DROP TABLE #t
GO
CREATE TABLE #t
(
 id INT,
 reportToID INT NULL,
)
INSERT INTO #t SELECT 1, NULL
UNION ALL SELECT 2, 1
UNION ALL SELECT 3, 1
UNION ALL SELECT 4, 2
GO
WITH MyCTE (id, reportToID, Level)
AS
(
 SELECT t1.ID, t1.reportToID, CAST(0 AS INT) AS Level
   FROM #t AS t1
  WHERE reportToID IS NULL
  UNION ALL
 SELECT t1.ID, t1.reportToID, CAST(CEILING(Level * RAND()) AS INT) AS Level
   FROM #t AS t1
   JOIN MyCTE AS t2
     ON t1.reportToID = t2.ID
)
SELECT *
  FROM MyCTE
GO

Noch kein Feedback


Formular wird geladen...

Kommentar-Feed für diesen Eintrag

Alle Blogs

  • =tg=
  • Andreas Wolter
  • Armin Neudert
  • Christoph Ingenhaag
  • cmu
  • Downloads
  • Falk Krahl
  • Fehlermeldungen
  • Frank Kalis
  • Holger Schmeling
  • InsideSQL.org Blogs
  • Klaus Oberdalhoff
  • Olaf Pietsch
  • Pressemitteilungen
  • Sascha Lorenz
  • tosc
  • Uwe Ricken
  • Weblinks

XML-Feeds

  • RSS 2.0: Einträge, Kommentare
  • Atom: Einträge, Kommentare
  • RDF: Einträge, Kommentare
  • RSS 0.92: Einträge, Kommentare
What is RSS?

©2025 by Frank Kalis • Kontakt • Hilfe • Web Site Builder

Secure CMS