Conflits de colonne avec le type d'autres colonnes dans la liste unpivot

Im pivotant sys.[views] dans des paires de valeurs clés pour comparer avec des valeurs sur un autre serveur pour tester la cohérence. Je tombe sur un problème qui renvoie l'erreur.

Msg 8167, Niveau 16, État 1, Ligne 51

le type de colonne "type" entre en conflit avec le type d'autres colonnes spécifiées dans la liste UNPIVOT.

Requête:

SELECT
sourceUnpivoted.idServer,
sourceUnpivoted.sourceServerName,
sourceUnpivoted.name,
sourceUnpivoted.columnName,
sourceUnpivoted.columnValue
FROM (
SELECT 
CAST('1' AS VARCHAR(255)) AS idServer,
CAST('thisOne' AS VARCHAR(255)) AS sourceServerName,
CAST('theDatabase' AS VARCHAR(255)) AS sourceDatabaseName,
CAST(name AS VARCHAR(255)) AS name,
CAST(object_id AS VARCHAR(255)) AS object_id,
CAST(principal_id AS VARCHAR(255)) AS principal_id,
CAST(schema_id AS VARCHAR(255)) AS schema_id,
CAST(parent_object_id AS VARCHAR(255)) AS parent_object_id,
CAST(type AS VARCHAR(255)) AS type,
CAST(type_desc AS VARCHAR(255)) AS type_desc,
CAST(create_date AS VARCHAR(255)) AS create_date,
CAST(lock_escalation_desc AS VARCHAR(255)) AS lock_escalation_desc
...
FROM noc_test.dbo.stage_sysTables
) AS databaseTables
UNPIVOT (
columnValue FOR columnName IN (
object_id,
principal_id,
schema_id,
parent_object_id,
type,
type_desc,
create_date,
lock_escalation_desc
) 
) AS sourceUnpivoted

Pourquoi n'est-ce pas comme [type],[type_desc],<!--4 ??? Ive a essayé aussi de CONVERT(VARCHAR(255),type) AS type

19
demandé sur SliverNinja - MSFT 2012-06-22 18:19:00

5 réponses

C'est en fait un classement problème. Je peux le résoudre en changeant ces lignes:

CAST([type] collate database_default AS VARCHAR(255)) AS [type], 
CAST(type_desc collate database_default AS VARCHAR(255)) AS type_desc, 
CAST(create_date AS VARCHAR(255)) AS create_date, 
CAST(lock_escalation_desc collate database_default AS VARCHAR(255)) AS lock_escalation_desc 

Le problème est que name est collationné comme Latin1_General_CI_AS, alors que les 3 autres colonnes que vous avez mentionnées sont collationnées comme Latin1_General_CI_AS_KS_WS (du moins, sur ma machine, Je ne suis pas sûr de ce que ce serait sur un serveur/une base de données avec une collation par défaut différente).

27
répondu Damien_The_Unbeliever 2012-06-22 14:38:29

C'est l'une des solution pour ce type d'erreur

1: créer le cette table

CREATE TABLE People
(
PersonId int, 
Firstname varchar(50), 
Lastname varchar(25)
)

2: puis insérez

INSERT INTO People VALUES (1, 'Jim', 'Smith');
INSERT INTO People VALUES (2, 'Jane', 'Jones');
INSERT INTO People VALUES (3, 'Bob', 'Unicorn');

3: exécutez ce script vous obtenez l'erreur

Msg 8167, Niveau 16, État 1, Ligne 3 Le type de colonne "Lastname" entre en conflit avec le type d'autres colonnes spécifiées dans la liste UNPIVOT.

SELECT PersonId, ColumnName, Value
FROM People
unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv;

4: la solution est que vous devez utiliser un sousquery pour lancer d'abord la colonne Lastname pour avoir la même longueur que Prenom

SELECT PersonId, ColumnName, Value
FROM (
SELECT personid, firstname, cast(lastname AS VARCHAR(50)) lastname
FROM People
) d
unpivot(Value FOR ColumnName IN (FirstName, LastName)) unpiv;
12
répondu Beruk Berhane 2016-10-21 10:16:55

la clause PIVOT/UNPIVOT est sensible à l'État de remplissage ANSI de la colonne (clic droit- > Propriétés dans SSMS) ainsi que le type, la taille et la collation. Essayez de spécifier SET ANSI_PADDING ON/OFF dans la session avant d'ajouter ou de recréer la colonne en question pour qu'elle corresponde aux autres dans la clause PIVOT / UNPIVOT.

4
répondu Martin Smith 2015-08-03 10:21:25

J'ai rencontré cette même erreur et j'ai juste fait toutes les colonnes dans la table du même type de données - j'ai eu un mélange de int,varchar,nvarchar de différentes longueurs. Une fois que j'ai converti toutes les colonnes de ma table au même type - nvarchar(255) cela a fonctionné parfaitement.

1
répondu SliverNinja - MSFT 2017-09-13 17:33:17

j'ai eu le même problème. Fixe - le en cliquant avec le bouton droit de la souris sur l'en-tête de la colonne et en sélectionnant le type de changement "en utilisant locale". Voir ci-joint capture d'écran

1:Screen shot

0
répondu Jaco 2018-05-05 11:14:38