WHERE子句使用OPENQUERY与链接服务器

Phi*_*p88 4 sql-server sql-server-2012

我通过ODBC 连接MS SQL Server Express 2012数据库.

我的查询:

Select * from openquery(test,'SELECT * FROM Versuchsanlage_DB WHERE value =27')
Run Code Online (Sandbox Code Playgroud)

SQL QUERY

但是这个查询

 Select * from openquery(test,
   'SELECT * FROM Versuchsanlage_DB 
    WHERE identifier = AGENT.OBJECTS.Versuchsanlage.Variable_1_Byte')
Run Code Online (Sandbox Code Playgroud)

要么

Select * from openquery(test,
   'SELECT * FROM Versuchsanlage_DB
    WHERE identifier = Variable_1_Byte')
Run Code Online (Sandbox Code Playgroud)

不起作用.为什么?

Bry*_*yan 7

您正在列中搜索字符串值identifier.字符串必须用引号括起来.由于select语句是OPENQUERY作为字符串传递的,因此必须对该字符串中的引号进行转义:

Select * from openquery(test,
   'SELECT * FROM Versuchsanlage_DB 
    WHERE identifier = ''AGENT.OBJECTS.Versuchsanlage.Variable_1_Byte''')
Run Code Online (Sandbox Code Playgroud)

要么

Select * from openquery(test,
       "SELECT * FROM Versuchsanlage_DB 
        WHERE identifier = 'AGENT.OBJECTS.Versuchsanlage.Variable_1_Byte'")
Run Code Online (Sandbox Code Playgroud)

这些查询在功能上是相同的,一个只使用所有单引号而另一个使用双引号.选择您认为更容易阅读的内容.

或者,您可以删除OPENQUERY并使用EXECUTE...AT语法进行参数化(这需要为链接服务器启用RPC):

EXECUTE('SELECT * FROM Versuchsanlage_DB WHERE identifier = ?',
        'AGENT.OBJECTS.Versuchsanlage.Variable_1_Byte') AT [test];
Run Code Online (Sandbox Code Playgroud)