34

sys.[views]一貫性テストのために別のサーバーの値と比較するために、キーと値のペアにピボットしています。エラーを返す問題が発生しています。

メッセージ 8167、レベル 16、状態 1、行 51

列「type」のタイプが、UNPIVOT リストで指定された他の列のタイプと競合しています。

クエリ:

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

なぜこれが気に入らないの[type]です[type_desc][lock_escalation_desc]?私も試してみましたCONVERT(VARCHAR(255),type) AS type

4

5 に答える 5

40

それは実際には照合の問題です。これらの行を変更することで解決できます。

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 

特定の問題は、あなたが言及した他の3つの列がnameとして照合されるLatin1_General_CI_ASのに対し、それは照合されることですLatin1_General_CI_AS_KS_WS(少なくとも、私のマシンでは、デフォルトの照合が異なるサーバー/データベースでどのようになるかわかりません)。

于 2012-06-22T14:24:45.387 に答える
26

これは、このタイプのエラーの解決策の 1 つです。

1: このテーブルを作成する

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

2:次に挿入

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

3: このスクリプトを実行すると、エラーが発生します

メッセージ 8167、レベル 16、状態 1、行 3 列「姓」の型が、UNPIVOT リストで指定されている他の列の型と競合しています。

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

4: 解決策は、サブクエリを使用して、最初に Lastname 列を 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;
于 2014-07-08T14:09:40.223 に答える
4

PIVOT/UNPIVOT 句は、列の ANSI パディング ステータス (右クリック -> SSMS のプロパティ) だけでなく、型、サイズ、および照合順序にも影響されます。問題の列を追加または再作成する前に、セッションで SET ANSI_PADDING ON|OFF を指定して、PIVOT/UNPIVOT 句の他の列と一致するようにしてください。

于 2015-08-03T10:21:25.230 に答える