【问题标题】:SQL JOIN OPENQUERY AssistanceSQL JOIN OPENQUERY 协助
【发布时间】:2021-01-29 04:23:55
【问题描述】:

寻找解决以下问题的最佳方法的建议

TBL1(本地 SQL 数据库),其中 ID = varchar

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

尝试了几种不同的方法,例如 CAST/CONVERT,但最终会出现错误,例如“转换 varchar 值 '12345 时转换失败 ' 到数据类型 int。” 或为 TBL2 获取所有 NULL。

尝试了以下方法:

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

这会导致“转换 varchar 值 '12345 时转换失败 ' 到数据类型 int。"

也尝试过:

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 

这会导致显示 TBL1.ID 值,但所有 TBL2.Name 值都是 NULL

【问题讨论】:

  • 例如:================== 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] AS C left outer JOIN TBL1 ON CAST(TBL1.ID as INT) = TBL2.ID ================== 这导致错误:“将 varchar 值 '12345' 转换为数据类型 int 时转换失败。”其他示例我们尝试将 TBL2.ID 转换为 varchar 并返回结果,但是 Name 列包含所有空值
  • 不要在 cmets 中添加事实,更新问题文本。
  • 使用WITH TBL1 as (SELECT CAST([Results] AS INT) as 'ID'
  • 这导致“将varchar值'12345'转换为数据类型int时转换失败。”
  • 如果是这样,请检查该值 - 可能它包含另一个不可打印字符的多余空格。 PS。精确指定本地 DBMS,包括精确版本。还要检查 OPENQUERY 参数中的'select CAST(ID AS CHAR), Name from DB' 是否解决。

标签: mysql sql linked-server openquery


【解决方案1】:

您的语法看起来不正确。 DB C 来自哪里? 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;

【讨论】:

  • try_cast 将给出 FALSE,然后再次获取 TBL2 的所有 NULL
  • @Akina,你是什么意思? try_cast 不返回 FALSE 值,如果强制转换不成功,它将返回 NULL。在 MS SQL 服务器中,无论如何都没有 FALSE(可能你的意思是 0)。
  • 我试过了,没有出错。它将返回 TBL1.ID 字段,但 TBL2.Name 字段均为空
  • @Austin4778,你说你的名字是空的????您确定您的 [NAME] 值已经不包含所有 NULL 吗?
  • 正确。我确认源 MYSQL DB 中没有 NULLS
【解决方案2】:

选项 1:尝试在房子的 MySQL 端将 INT 转换为 varchar。尝试在传递给 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 

另一个选项当然是相反的(如果你想通过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 

【讨论】:

  • 像下面这样? select * from openquery(LINKEDSERVER,'select CONVERT(ID, CHAR) as ID, Name from DB') 这导致返回了 ID,但是 name 列都是空的
  • 如果您在 MYSQL 中独立运行了相同的查询,并且它返回的行与您通过链接服务器运行它时返回的行不同,那么您用于构建链接服务器的链接服务器驱动程序出现了问题。也许尝试 ODBC 版本或直接版本。我也会首先在 MSSQL 中运行 LinkedServer 查询,以确保实际发生这种不匹配
  • Chuma - 你能举个例子吗?
  • 哦,只是说,拿这个查询,直接登录到你的MYSQL数据库并运行这个查询:select CONVERT(ID, CHAR) as ID, Name from DB。验证结果是否不同于 select * from openquery(LINKEDSERVER,'select CONVERT(ID, CHAR) as ID, Name from DB')。如果结果不匹配,您就知道您的链接服务器驱动程序有问题,您可以从那里开始。如果相同,您的情况应该得到解决,您现在知道您有空名称值
  • 感谢您的回复。我对两者都进行了测试,可以确认结果是一样的。
【解决方案3】:

感谢大家的帮助。这就是它的工作原理:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    相关资源
    最近更新 更多