Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 列的类型与UNPIVOT列表中指定的其他列的类型冲突_Sql_Sql Server_Dynamic Sql_Unpivot - Fatal编程技术网

Sql 列的类型与UNPIVOT列表中指定的其他列的类型冲突

Sql 列的类型与UNPIVOT列表中指定的其他列的类型冲突,sql,sql-server,dynamic-sql,unpivot,Sql,Sql Server,Dynamic Sql,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 = O

我在单独的数据库中有两个表,我正试图将它们合并在一起,以创建资产及其读数的列表。我提出了以下问题:

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;
但是,我在运行查询时收到以下错误消息:


当我查看前面提到的列的数据类型时,对于我试图选择float和int的列,db1数据库有两种不同的数据类型。我试图将这些列名称从db1放入db2的列是数据类型nvarchar(100)。我尝试过铸造和转换SCADA_标签,但没有成功。我刚从另一个开发人员那里继承了这个SQL集成,我对pivot和unpivot功能感到生疏。任何帮助或建议都将不胜感激。

我知道这可能会很晚。但您可以首先尝试的几乎是对两个表进行模式比较。检查哪些列或数据类型不相同。请参阅下面的脚本

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'

我知道这可能很晚了。但您可以首先尝试的几乎是对两个表进行模式比较。检查哪些列或数据类型不相同。请参阅下面的脚本

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'

我最后做的,可能不是最有效的处理方法,就是从源数据库获取列,并将它们转换和选择为NVARCHAR(100)列

这给了我一个与原始表具有相同结构和值的表,但除[timestamp]列外,所有列都已转换为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

如果有更有效的方法,我会洗耳恭听。

我最后做的事情,可能不是最有效的处理方法,就是从源数据库获取列,然后将它们转换并选择为NVARCHAR(100)列

这给了我一个与原始表具有相同结构和值的表,但除[timestamp]列外,所有列都已转换为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

如果有更有效的方法,我会全神贯注。

如果要取消激发列中的所有行,则必须是相同的数据类型。如果要取消激发列中的所有行,则必须是相同的数据类型。