【发布时间】: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 执行此操作时,我收到以下错误:
消息 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