2016-06-14 786 views
0

我在兩個單獨的數據庫中有兩個表,我試圖合併在一起以創建資產及其讀數列表。我想出了以下查詢:列的類型與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數據庫對於我試圖選擇的列有兩種不同的數據類型 - float和int。我試圖將這些列名稱從db1放入db2的列是數據類型nvarchar(100)。我已經嘗試投射和轉換SCADA_TAG沒有成功。我剛剛從另一個開發人員繼承了這個SQL集成,並且因爲pivot和unpivot功能而生鏽。任何幫助或建議將不勝感激。

+0

如果您對列中的所有行進行反轉 - 必須是相同的數據類型。 – gofr1

回答

0

我知道這可能會很晚。但是你可以先嚐試幾乎就像兩個表上的模式比較。檢查列或數據類型是否不相同。見下面的腳本。

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與[時間戳]列除外。我就能夠運行以下SQL返回非透視和合並後的結果集資產和讀數:

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 

如果有一個更有效的方法,我所有的耳朵。