简体   繁体   English

SQL 加入开放查询协助

[英]SQL JOIN OPENQUERY Assistance

Looking for advise on the best way to approach the following寻求有关处理以下问题的最佳方法的建议

TBL1 (Local SQL DB) where ID = varchar TBL1(本地 SQL DB)其中 ID = varchar

TBL2 (Remote MYSQL DB) where ID = INT TBL2(远程 MYSQL DB),其中 ID = INT

WITH TBL1 as (
SELECT 
     [Results]  as 'ID'
 FROM [DB].[results]
),

TBL2 as (


select * from openquery(LINKEDSERVER,'select  ID, Name from DB')

) 

Select  
   TBL1.[ID],

   TBL2.[NAME] 
FROM [DB]
left outer JOIN TBL1 ON TBL1.ID = TBL2.ID

Tried a couple different methods like CAST/CONVERT, but ending up with either an error like "Conversion failed when converting the varchar value '12345 ' to data type int."尝试了几种不同的方法,如 CAST/CONVERT,但最终出现“将 varchar 值 '12345' 转换为数据类型 int 时转换失败”之类的错误。 or getting all NULLS for TBL2.或获取 TBL2 的所有 NULLS。

Attempted the following:尝试了以下操作:

WITH TBL1 as 
( 
SELECT CAST(ISNULL([Results],'0') AS INT) as 'ID' 
FROM [DB].[results] 
), 
TBL2 as ( select * from openquery(LINKEDSERVER,'select ID, Name from DB') 
) 

Select TBL1.[ID], TBL2.[NAME] 
FROM TBL1 Left Outer join TB2 ON TBL1.ID = TBL2.ID

This results in "Conversion failed when converting the varchar value '12345 ' to data type int."这导致“将 varchar 值 '12345' 转换为数据类型 int 时转换失败。”

Also Attempted:还尝试过:

WITH TBL1 as ( SELECT [Results] as 'ID' FROM [DB].[results] 
), 

TBL2 as ( select * from openquery(LINKEDSERVER,'select CONVERT(ID, CHAR) AS ID, Name from DB') 
) 

Select TBL1.[ID], TBL2.[NAME] 
FROM TBL1 Left Outer join TB2 ON TBL1.ID = TBL2.ID 

This results in the TBL1.ID values being displayed, but all the TBL2.Name values are NULL这会导致显示 TBL1.ID 值,但所有 TBL2.Name 值都是 NULL

Option 1: Try converting the INT to varchar on the MySQL side of the house.选项 1:尝试在房子的 MySQL 一侧将 INT 转换为 varchar。 Try to do it right in the sql statement you pass in to the LinkedServer.尝试在您传递给 LinkedServer 的 sql 语句中正确执行此操作。

WITH TBL1 as ( SELECT [Results] as 'ID' FROM [DB].[results] 
), 

TBL2 as ( select * from openquery(LINKEDSERVER,'select CONVERT(ID, CHAR) AS ID, Name from DB') 
) 

Select TBL1.[ID], TBL2.[NAME] 
FROM TBL1 Left Outer join TB2 ON TBL1.ID = TBL2.ID 

The other option is of course the reverse (if you want to join by INT)另一个选项当然是相反的(如果你想通过 INT 加入)

WITH TBL1 as 
( 
SELECT CAST(ISNULL(TRIM([Results]),'0') AS INT) as 'ID' 
FROM [DB].[results] 
), 
TBL2 as ( select * from openquery(LINKEDSERVER,'select ID, Name from DB') 
) 

Select TBL1.[ID], TBL2.[NAME] 
FROM TBL1 Left Outer join TB2 ON TBL1.ID = TBL2.ID 

Your syntax doesn't look right.您的语法看起来不正确。 Where does the DB C come from? DB C 从何而来? Isn't DB the schema name? DB不是模式名称吗?

WITH TBL1 as (
SELECT 
     [Results]  as ID
 FROM [DB].[results]
),
TBL2 as (
    select * from openquery(LINKEDSERVER,'select  ID, Name from DB')
) 

Select  
   TBL1.[ID],
   TBL2.[NAME] 
FROM TBL2 left outer JOIN TBL1 ON try_cast(TBL1.ID as int) = TBL2.ID;

Appreciate everyone's help.感谢大家的帮助。 This is what got this working:这就是使它起作用的原因:

WITH TBL1 AS (
    SELECT REPLACE(REPLACE(ID, CHAR(13), ''), CHAR(10), '') 
    FROM DB
    WHERE ISNUMERIC(REPLACE(REPLACE(ID, CHAR(13), ''), CHAR(10), '')) = 1

),
TBL2 AS (
    SELECT *
    FROM OpenQuery(
        LINKEDSERVER,
        'SELECT id, name FROM DB'
    )
)
SELECT 
    TBL1.ID
    ,TB2.Name
FROM TBL2
LEFT OUTER JOIN TBL1 ON TBL1.ID = TBL2.id

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM