【问题标题】:SQL Server stored procedure dynamic query (openquery) for a linked SQLite database returns errors链接 SQLite 数据库的 SQL Server 存储过程动态查询 (openquery) 返回错误
【发布时间】:2020-05-24 00:43:48
【问题描述】:

我有 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

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

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

消息 102,第 15 级,状态 1,第 15 行
')' 附近的语法不正确。

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

我还将@jd 参数用单引号括起来。我也试过没有这个,但不管我做什么都会出错。

有人可以帮忙吗?

【问题讨论】:

  • 调试动态 SQL 的方式是将 exec(@sql) 替换为 print(@sql),此时您拥有静态 SQL,并且易于调试。如果您仍然卡在那个点上,请发布print(@sql) 的结果,以便我们提供帮助。
  • 这个+ '' + 没有任何用处。您只是连接一个空字符串。您可能打算使用+ '''' + (仔细计算那些单引号)。更重要的是,您必须实际查看您的查询才能对其进行调试。

标签: sql-server sql-server-2008 openquery dynamicquery


【解决方案1】:

使用 + '' + 插入 ' 分隔符不起作用。

解决办法是关闭分隔符,使用+“'”+

我有点怀疑这一点,但因为微软从 SSLS 2019 中删除了调试,呵呵!我安装了 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多