2012-06-22 14 views
18

Im Pivotieren sys.[views] in Schlüsselwertpaare zum Vergleichen mit Werten auf einem anderen Server für Konsistenzprüfung. Ich stehe auf ein Problem, das den Fehler zurückgibt.Die Spalte Konflikt mit dem Typ der anderen Spalten in der Entsperrliste

Msg 8167, Ebene 16, Status 1, 51 Linie

Die Art der Spalte "Typ" Konflikte mit der Art der anderen Spalten in der UNPIVOT Liste angegeben.

Abfrage:

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 

Warum funktioniert das nicht wie [type], [type_desc], [lock_escalation_desc] ??? Ive auch versucht CONVERT(VARCHAR(255),type) AS type

+1

Haben Sie all diese '
's zu Ihrer Frage von Hand hinzugefügt? Wenn ja, hast du nicht einen Punkt erreicht, an dem du gedacht hast "Es muss einen besseren Weg geben"? Wenn Sie Code veröffentlichen, markieren Sie den entsprechenden Block und klicken Sie auf den '{}' - Code-Formatierungsbutton - er behält Zeilenumbrüche bei und fügt Syntax-Highlighting hinzu. –

+0

schön krank geben Sie das nächste Mal versuchen. – DarkRiver

Antwort

26

Es ist eigentlich ein Kollationsproblem. Ich kann es lösen, indem Sie die folgenden Zeilen zu ändern:

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 

Das spezifische Problem ist, dass name als Latin1_General_CI_AS gesammelt wird, während die anderen drei Spalten, die Sie als Latin1_General_CI_AS_KS_WS zusammengestellt erwähnt werden (zumindest auf meinem Rechner, ich bin nicht sicher, wie es auf einem Server/Datenbank mit anderen Standard-Sortierung wäre).

+0

So funktioniert es im Falle einer dynamischen Abfrage wie folgt: set @ sql = 'SELECT max (col) FROM (SELECT Umwandlung (' + @ col + 'als numerisches (3,0)) selectedcols FROM Tabelle) d pivivot (col FOR selectedcols IN ('+ @ col +')) unpiv '; exec (@sql) – AskMe

10

Dies ist einer der Lösung für diese Fehler

1: Erstellen der diese Tabelle

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

2: Legen Sie dann

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

3: dieses Skript Sie das bekommen Fehler

Msg 8167, Ebene 16, Status 1, Zeile 3 Der Typ der Spalte mn "Nachname" steht in Konflikt mit dem Typ anderer Spalten, die in der UNPIVOT-Liste angegeben sind.

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

4: Die Lösung ist, dass Sie eine Unterabfrage zu gieße zuerst den Nachnamen Spalte die gleiche Länge wie Vorname haben

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; 
+0

Funktioniert nicht im Falle einer dynamischen Abfrage wie folgt: set @ sql = 'SELECT max (col) FROM (SELECT Umwandlung (' + @ col + 'als numerischer Wert (3,0)) selectedcols FROM Tabelle) d pivivot (col FOR SELECTEDcols IN ('+ @ col +')) unpiv '; exec (@sql) – AskMe

3

Die PIVOT/UNPIVOT Klausel ist empfindlich für den ANSI-Padding-Status verwenden müssen die Spalte (Rechtsklick -> Eigenschaften in SSMS) sowie die Art, Größe und Sortierung. Versuchen Sie, SET ANSI_PADDING ON | OFF in der Sitzung anzugeben, bevor Sie die fragliche Spalte hinzufügen oder erneut erstellen, damit sie mit den anderen in der PIVOT/UNPIVOT-Klausel übereinstimmt.

+0

Diese Antwort ergab mehr Sinn als die oben genannten, danke. –

1

Liefen in diesen gleichen Fehler und ich alle Spalten in der Tabelle mit dem gleichen Datentyp gerade gemacht - ich eine Mischung aus int hatte, varchar, nvarchar verschiedene Längen. Nachdem ich alle Spalten in meiner Tabelle in den gleichen Typ konvertiert hatte - nvarchar(255) - funktionierte es perfekt.

Verwandte Themen