[链接的SQLite数据库的SQL Server存储过程动态查询(openquery)返回错误

问题描述 投票:-1回答:1

我有SQL Server 2019,并已将名为[PSMDB_WIN_SVR]的SQLite数据库链接到它。

我的目标是从链接数据库中检索所有大于或等于代表朱利安日期/时间的双变量参数的记录的数据。该查询在本机SQLite环境中运行良好:

    SELECT julianDateUTC,
           frequency,
           Vrms, 
           I1rms,
           I2rms,
           I3rms,
           P1,
           P2, 
           P3,
           ProcessorTemp,
           Quality
    FROM tblRealTimeData
    WHERE  julianDateUTC >=  :JD
    ORDER BY julianDateUTC;

我已经在SQL Server中创建了以下动态存储过程:

USE [pMonNetworkServer]
GO
/****** Object:  StoredProcedure [dbo].[getNewDataProc]    Script Date: 24/05/2020 09:27:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE getNewDataProc
@jd VARCHAR(50)
AS
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * FROM OPENQUERY(PSMDB_WIN_SVR, ' + 
               '' + 'SELECT julianDateUTC,
                     frequency,
                     Vrms, 
                     I1rms,
                     I2rms,
                     I3rms,
                     P1,
                     P2, 
                     P3,
                     ProcessorTemp,
                     Quality
            FROM tblRealTimeData
            WHERE  julianDateUTC >= ' + '' + @jd + '' + 
          ' ORDER BY julianDateUTC;' + '' + ')'
EXEC (@sql)
GO

当我使用SSMS执行此操作时,我得到以下信息:

Execution of Stored procedure

Msg 156,第15级,状态1,第3行关键字“ SELECT”附近的语法不正确。Msg 102,第15级,状态1,第15行')'附近的语法不正确。

(影响1行)

完成时间:2020-05-24T10:30:54.8070814 + 10:00

显然我的语法不正确。 OPENQUERY sql字符串必须在引号中设置为文字,我为此使用了''。

我也将@jd参数括在单引号中。我也尝试过没有此操作,但是无论如何我都会收到错误消息。

有人可以帮忙吗?

sql-server sql-server-2008 openquery dynamicquery
1个回答
0
投票

[使用+''+插入'分隔符无效。

解决方案是关闭分隔符并使用+“'” +

我有点怀疑,但是因为Microsoft从SSLS 2019 duhhh中删除了调试功能!我安装了17并确认了问题。

正确的代码是

USE [pMonNetworkServer]
GO
/****** Object:  StoredProcedure [dbo].[getNewDataProc]    Script Date: 24/05/2020 13:13:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
CREATE PROCEDURE [dbo].[getNewDataProc2]
@jd VARCHAR(50)
AS
BEGIN
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * FROM OPENQUERY(PSMDB_WIN_SVR, ' +   
                "'" + 'SELECT julianDateUTC,
                     frequency,
                     Vrms, 
                     I1rms,
                     I2rms,
                     I3rms,
                     P1,
                     P2, 
                     P3,
                     ProcessorTemp,
                     Quality ' +
            ' FROM tblRealTimeData ' +
            ' WHERE  julianDateUTC >= ' + @jd +  
            ' ORDER BY julianDateUTC;' + "'" + ')'
END
EXEC (@sql)

Best regards

Rob
© www.soinside.com 2019 - 2024. All rights reserved.