Erreur CTE récursive: les types ne correspondent pas

J'ai ce CTE

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' 

Cela fonctionne sur un server, sans cette partie commentée qui spécifie le classment. Ensuite, je copy le tout dans une autre window où une copy répliquée de la même database vit sur un autre server et get cette erreur.

Les types ne correspondent pas entre l'ancre et la partie récursive dans la colonne "Variant Code" de la requête récursive "items".

À l'origine, je n'avais pas non plus ces fonctions CAST , cela fonctionnait très bien sur le server n ° 1. Enfin, je place la command collate dans la partie supérieure du CTE, puis cela fonctionne sur les deux machines.

Je vérifie la version par 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) 

et ils sont identiques, donc je pense que cela doit être un réglage d'option qui est différent.

Est-ce que quelqu'un sait où je regarde pour voir quelle est cette option?

De DE doc:

Le type de données d'une colonne dans le membre récursif doit être le même que le type de données de la colonne correspondante dans le membre d'ancrage.

Donc, il devrait avoir le même type de données, longueur, collation, ….

Dans votre exemple:

 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'; 

Vérifier

 SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') 

et:

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