我正在尝试使用包含简单 JOIN(或 LEFT JOIN)的 SQL 查询执行 OdbcCommand。我收到以下错误:
System.Data.Odbc.OdbcException (0x80131937): ERROR [37000] [ProvideX][ODBC Driver]Unexpected extra token: JOIN
我的代码如下所示:
using var connection = GetOdbcConnection();
connection.Open();
var odbcCommand = new OdbcCommand(SqlQueries.SelectItems, connection);
var reader = odbcCommand.ExecuteReader();
并且
SqlQueries.SelectItems
是:
public const string SelectItems = @"SELECT * FROM Table1 JOIN Table2 ON Table2.Key = Table1.Key";
如果我在 SSMS 中执行以下查询,它工作正常:
SELECT
TOP 10 *
FROM OPENQUERY([DSN_NAME], 'select * from Table1')
LEFT JOIN (SELECT * FROM OPENQUERY([DSN_NAME], 'select * from Table2')) ON Table1.Key = Table2.Key
但是,如果我在 SSMS 中执行以下查询,我会重现完全相同的错误:
SELECT
TOP 10 *
FROM OPENQUERY([DSN_NAME], 'select * from Table1 join Table2 on Table1.Key = Table2.Key')
我尝试了以下方法:
执行与 SSMS 中使用的完全相同的查询(使用 OPENQUERY),出现以下错误:
Unexpected extra token: (
执行与 SSMS 中使用的完全相同的查询(使用 OPENQUERY),但这次使用
SqlConnection
和 SqlCommand
:
DSN=DSN_NAME
。我真的不知道 ODBC 是否还有其他连接字符串格式可以与 SqlConnection
我期望 ODBC 命令在两个表之间执行 JOIN 并返回结果。我真的不知道 ODBC 命令如何转换 SQL 查询并将其用于 ODBC 数据源,但必须有一种方法可以做到这一点,因为在 SSMS 中使用 OPENQUERY 时联接可以工作。
我唯一想到的是使用一个查询从表1中选择数据,然后使用另一个查询从表2中选择数据,然后在应用程序端将它们关联在一起;出于性能目的我真的不想这样做(除非我没有任何其他选择)。 这篇文章的答案中也提到了后一种解决方案。
NB:使用 ODBC 连接和 ODBC 命令,任何像
'SELECT * FROM Table1 WHERE MyParameter = ?'
这样的简单查询都可以正常工作。
从我们的内部问题来看,同样的错误 - 我不相信 Sage Mas90 db 支持内部令牌 - 但以下方法可能有效: 从
<table1>
,<table2>
哪里 <table1>
.<field>
= <table2>
.<field>