2016-07-13 13 views
2

Ich habe dieses CTErekursive CTE Fehler: Typen stimmen nicht überein

WITH items AS ( 
     SELECT 1 AS lvl, 
       i.[No_] [Parent Item No_], 
       i.[No_], 
       i.[Description], 
       CAST(N'' AS NVARCHAR(20)) /* COLLATE Latin1_General_100_CS_AS */ 
     FROM Item i 
     LEFT JOIN KitComponent bc ON bc.[Parent Item No_] = i.[No_] 
     LEFT JOIN Item ci ON ci.[No_] = bc.[No_] 
     GROUP BY i.[No_], i.[Description], i.[Unit Price] 

     UNION ALL 

     SELECT i.lvl + 1, 
       i.[No_], 
       i2.[No_], 
       i2.[Description], 
       CAST(bc.[Variant Code] AS NVARCHAR(20)) 
     FROM KitComponent bc 
     JOIN items i ON i.[No_] = bc.[Parent Item No_] 
     JOIN Item i2 ON i2.[No_] = bc.[No_] 
) 
SELECT * FROM items WHERE [Parent Item No_] = '4000540001' 

Es funktioniert auf einem Server, ohne dass kommentierte Teil die Sortierung angibt. Dann kopiere ich das Ganze in ein anderes Fenster, wo eine replizierte Kopie der gleichen Datenbank auf einem anderen Server lebt und diesen Fehler erhält.

Types don't match between the anchor and the recursive part in column "Variant Code" of recursive query "items".

ich ursprünglich auch nicht jene CAST Funktionen hatte, arbeitete sie auf dem Server # 1 gut. Schließlich setze ich den Befehl collate im oberen Teil des CTE und dann funktioniert es auf beiden Maschinen.

ich überprüfen Sie die Version von SELECT @@VERSION

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
    Oct 20 2015 15:36:27 
    Copyright (c) Microsoft Corporation 
    Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 
    (Hypervisor) 

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
    Oct 20 2015 15:36:27 
    Copyright (c) Microsoft Corporation 
    Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 
    (Hypervisor) 

und sie sind identisch, so denke ich, das muss eine Option Einstellung sein, die anders ist.

Weiß jemand, wo ich sehe, welche Option das ist?

+1

Schnelle Schätzung: Datenbanksortierung <> Tabellenkollation (Spalte). Klicken Sie mit der rechten Maustaste auf DB - Eigenschaften -> Kollatierung, und machen Sie dasselbe für Tabellen. – lad2025

Antwort

1

Von WITH doc:

The data type of a column in the recursive member must be the same as the data type of the corresponding column in the anchor member.

So soll es die gleiche Datentyp hat, Länge, Sortierung, ....

In Ihrem Beispiel:

WITH items AS ( 
     SELECT 1 AS lvl, 
       i.[No_] [Parent Item No_], 
       i.[No_], 
       i.[Description], 
       CAST(N'' AS NVARCHAR(20)) -- default DB collation 
     FROM Item i 
     LEFT JOIN KitComponent bc ON bc.[Parent Item No_] = i.[No_] 
     LEFT JOIN Item ci ON ci.[No_] = bc.[No_] 
     GROUP BY i.[No_], i.[Description], i.[Unit Price] 

     UNION ALL 

     SELECT i.lvl + 1, 
       i.[No_], 
       i2.[No_], 
       i2.[Description], 
       CAST(bc.[Variant Code] AS NVARCHAR(20)) -- column collation 
     FROM KitComponent bc 
     JOIN items i ON i.[No_] = bc.[Parent Item No_] 
     JOIN Item i2 ON i2.[No_] = bc.[No_] 
) 
SELECT * FROM items WHERE [Parent Item No_] = '4000540001'; 

prüfen

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') 

und:

SELECT COLLATION_NAME,* 
FROM INFORMATION_SCHEMA.COLUMNS  
WHERE table_name = 'KitComponent' 
    AND column_name = 'Variant Code' 
+1

Ich lief Ihre zwei Abfragen, für den db Kollatierungsnamen und der Sortierungs Namen der Spalte, und dem Server, auf dem alles funktioniert wie diese DB Kollatierungsnamen kam -> Latin1_General_100_CS_AS Spalte Sortierungsname -> Latin1_General_100_CS_AS Und die eine, wo ich casten und dann Sortierung angeben musste, um den gleichen Code zu erhalten, der wie folgt funktioniert: DB-Kollatierungsname -> SQL_Latin1_General_CP1_CI_AS Spaltenkollatierungsname -> Latin1_General_100_CS_AS –