web-dev-qa-db-fra.com

La colonne est en conflit avec le type des autres colonnes de la liste sans pivot

Im pivotant sys.[views] en paires de valeurs clés pour les comparer aux valeurs d’un autre serveur pour les tests de cohérence. Je rencontre un problème qui renvoie l'erreur.

Msg 8167, Niveau 16, Etat 1, Ligne 51

Le type de colonne "type" est en conflit avec le type des autres colonnes spécifiées dans la liste UNPIVOT.

Question:

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 est-ce que cela ne ressemble pas à [type], [type_desc], [lock_escalation_desc] ??? J'ai également essayé CONVERT(VARCHAR(255),type) AS type

20
DarkRiver

C'est en fait un problème de classement. 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 spécifique est que name est assemblé en tant que Latin1_General_CI_AS, alors que les 3 autres colonnes que vous avez mentionnées sont assemblées en tant que Latin1_General_CI_AS_KS_WS (Au moins, sur ma machine, je ne suis pas sûr de ce que ce serait sur un serveur/une base de données avec un assemblage par défaut différent) .

28

C'est l'une des solutions à ce type d'erreur 

1: créer le tableau 

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: lancez ce script vous obtenez l'erreur 

Msg 8167, niveau 16, état 1, ligne 3 Le type de colonne "Nom" est en conflit avec le type des 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 une sous-requête pour convertir la colonne Lastname en premier pour qu'elle ait la même longueur que Firstname.

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;
13
Beruk Berhane

La clause PIVOT/UNPIVOT est sensible au statut de remplissage ANSI de la colonne (clic droit -> propriétés dans SSMS), ainsi qu'au type, à la taille et au classement. Essayez de spécifier SET ANSI_PADDING ON | OFF dans la session avant d'ajouter ou de recréer la colonne en question afin qu'elle corresponde aux autres éléments de la clause PIVOT/UNPIVOT.

4
Martin Smith

Couru dans cette même erreur et je viens de faire toutes les colonnes dans la table du même type de données - j'avais un mélange de int, varchar, nvarchar de différentes longueurs. Une fois que j'ai converti toutes les colonnes de ma table dans le même type - nvarchar(255) cela fonctionnait parfaitement. 

2
SliverNinja - MSFT

J'ai eu le même problème. Corrigé en faisant un clic droit sur l'en-tête de la colonne et en sélectionnant le type de modification "en utilisant les paramètres régionaux" Voir la capture d'écran ci-jointe

1 :  Screen shot

0
Jaco