2016-06-14 20 views
0

アセットのリストとその読み取り値を作成するために、別々のデータベースに2つのテーブルがあります。クエリを実行するときに、私は次のエラーメッセージを受信して​​いますが列の型がUNPIVOTリストに指定されている他の列の型と競合しています

use [db1] 
DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 
select @colsUnpivot 
    = stuff((select ','+quotename(C.name) 
      FROM sys.columns c 
      where c.object_id = OBJECT_ID('db1.dbo.RUNTIME') and c.name != 'timestamp' 
      for xml path('')), 1, 1, '') 


use [db2] 
set @query = ' 
SELECT 
    a.[ID], 
    a.[ASSETCLASS], 
    a.[ASSETID], 
    a.[READINGNAME], 
    CONVERT(nvarchar(max), a.[SCADA_TAG]) as [SCADA_TAG], 
    b.timestamp AS [READINGDATE], 
    b.scada_value AS [READING] 
/*,[PROCESSED]*/ FROM [scada].[PREPROCESSING] a 
LEFT JOIN (SELECT 
    [timestamp], 
    CONVERT(nvarchar(max), [SCADA_TAG]) as [SCADA_TAG], 
    [SCADA_VALUE] 
FROM [db1].[dbo].[RUNTIME] UNPIVOT (SCADA_VALUE FOR SCADA_TAG IN ('+ @colsUnpivot +')) u) b 
    ON a.scada_tag = b.scada_tag' 

    exec sp_executesql @query; 

、::私は次のクエリを思い付いた

enter image description here

私が言及した列のデータ型を見てみるとdb1データベースには、select-floatとintをしようとしている列の2つの異なるデータ型があります。これらの列名をdb1からdb2に配置しようとしている列のデータ型はnvarchar(100)です。私はキャストし、SCADA_TAGを成功しないように変換しようとしました。私はちょうど別のdevからSQL統合を継承し、私はピボットとunpivotの機能に錆びています。どんな助けやアドバイスも大歓迎です。

+0

列のすべての行をアンピボットする場合は、同じデータ型である必要があります。 – gofr1

答えて

0

これは遅れている可能性があります。しかし、最初に試すことができるのは、2つのテーブルのスキーマ比較のようなものです。同じではない列やデータ型があるかどうかを確認する。以下のスクリプトを参照してください。

SELECT c.name AS ColumnName, 
    t.name AS DataType, 
    c.max_length 
FROM [DB1].sys.columns c 
INNER JOIN [DB1].sys.types t 
    ON c.user_type_id=t.user_type_id 
WHERE OBJECT_NAME(object_id) = 'TableName' 


EXCEPT 

SELECT c.name AS ColumnName, 
    t.name AS DataType, 
    c.max_length 
FROM [DB2].sys.columns c 
INNER JOIN [DB2].sys.types t 
    ON c.user_type_id=t.user_type_id 
WHERE OBJECT_NAME(OBJECT_ID) = 'TableName' 
0

私は何をやってしまった、これはおそらく、これを処理する最も効率的な方法ではありませんが、ソース・データベースから列を取得し、変換しNVARCHAR(100)の列​​にそれらを選択することです。

USE [db1] 
DECLARE @tagNames AS nvarchar(max), 
     @query AS nvarchar(max) 
SELECT 
    @tagNames 
    = STUFF((SELECT 
    ', CAST(' + QUOTENAME(C.name) + ' as nvarchar(100)) as ' + QUOTENAME(c.name) 
    FROM sys.columns c 
    WHERE c.object_id = OBJECT_ID('db1.dbo.RUNTIME') 
    AND c.name != 'timestamp' 
    FOR xml PATH ('')) 
    , 1, 1, '') 

USE [db2] 
SET @query = 'select [timestamp], ' + @tagNames + ' into test_runtime from 
    [db1].dbo.RUNTIME' 
EXEC sp_executesql @query 

これは私の元と同じ構造および値を持つテーブルを与えるが、すべての列は、[タイムスタンプ]カラムを除いてNVARCHARに変換されています。私はすべての耳をしています、より効率的な方法があれば

DECLARE @colsUnpivot AS nvarchar(max), 
     @query AS nvarchar(max) 
SELECT 
    @colsUnpivot 
    = STUFF((SELECT 
    ',' + QUOTENAME(C.name) 
    FROM sys.columns c 
    WHERE c.object_id = OBJECT_ID('dbo.test_RUNTIME') 
    AND c.name != 'timestamp' 
    FOR xml PATH ('')) 
    , 1, 1, '') 

SET @query = ' 
SELECT 
    a.[ID], 
    a.[ASSETCLASS], 
    a.[ASSETID], 
    a.[READINGNAME], 
    a.[SCADA_TAG], 
    b.timestamp AS [READINGDATE], 
    b.scada_value AS [READING] 
FROM [scada].[PREPROCESSING] a 
LEFT JOIN (SELECT 
    [timestamp], 
    [scada_tag], 
    [SCADA_VALUE] 
FROM [dbo].[test_RUNTIME] UNPIVOT (SCADA_VALUE FOR SCADA_TAG IN (' + @colsUnpivot + ')) u) b 
    ON a.scada_tag = b.scada_tag' 

EXEC sp_executesql @query; 
GO 

:私は、資産と測定値のアンピボットとマージされた結果セットを返すために、次のSQLを実行することができています。

関連する問題