我在不同的数据库中有两个表,我正在尝试将它们合并在一起,以创建资产及其读数的列表。我提出了以下查询:
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;但是,在运行查询时,I会收到以下错误消息:

当我查看前面提到的列的数据类型时,db1数据库对我要选择的列有两种不同的数据类型-浮点型和整型。我试图将这些列名从db1放到db2中的列的数据类型是nvarchar(100)。我尝试过强制转换和转换SCADA_TAG,但都没有成功。我刚从另一个开发人员那里继承了这个SQL集成,我对pivot和unpivot功能已经生疏了。任何帮助或建议都将不胜感激。
发布于 2016-06-14 23:19:17
我知道这可能有点晚了。但是,您可以首先尝试对这两个表执行类似于模式比较的操作。检查哪些列或数据类型不同。请参见下面的脚本。
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'发布于 2016-06-14 23:30:13
我最终要做的可能不是最有效的处理方法,就是从源数据库中获取列,并将它们转换并选择为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这为我提供了一个与原始表具有相同结构和值的表,但除了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如果有更有效的方法,我洗耳恭听。
https://stackoverflow.com/questions/37813756
复制相似问题