2016-06-14 4 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 데이터베이스에는 select-float 및 int를 시도하는 열에 대한 두 개의 다른 데이터 유형이 있습니다. 이 열 이름을 db1에서 db2로 가져 오려고하는 열의 데이터 형식은 nvarchar (100)입니다. SCADA_TAG를 캐스팅하고 변환하려고 시도했지만 성공하지 못했습니다. 난 그냥 다른 SQL 에서이 SQL 통합을 상속 및 피벗 및 unpivot 기능 녹슨거야. 어떤 도움이나 조언이라도 대단히 감사하겠습니다.

+0

열의 모든 행을 언 베이킹하는 경우 - 동일한 데이터 유형이어야합니다. – gofr1

답변

0

나는 이것이 늦을 수도 있음을 알고 있습니다. 하지만 먼저 시도 할 수있는 것은 두 테이블의 스키마 비교와 거의 같습니다. 같은 열이나 데이터 유형이 아닌지 확인합니다. 아래 스크립트를 참조하십시오.

내가하고 결국, 이것은 아마도 소스 데이터베이스에서 열을 받고,이를 처리하고 변환 NVARCHAR (100) 열로를 선택하는 가장 효율적인 방법은 아니다 무엇
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

. 이 날 일본어 그러나 모든 컬럼과 동일한 구조 및 값을 가진 테이블을 제공

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을 실행할 수 있어요.