【发布时间】:2018-12-24 17:09:52
【问题描述】:
我有一个使用 openquery 的动态 SQL 查询给我一个语法错误。该语句在通过查询窗口(无动态 SQL)运行时运行良好,但在尝试通过 SQL 代理运行时,它会失败并显示 -
无法准备声明。 [SQLSTATE 42000](错误 8180)'=' 附近的语法不正确。 [SQLSTATE 42000](错误 102)
链接服务器“_________”的 OLE DB 提供程序“SQLNCLI11”返回消息“延迟准备无法完成。”。 [SQLSTATE 01000](错误 7412)。步骤失败。
SELECT @SQL = N'
Insert into ' + @ToDatabase + '.dbo.UserUsages
(Date, AppCode, UserName, EriAccountId, [Count], SubscriptionCode)
SELECT Timestamp
, Appcode
, Username
, EriAccountId
, [Count]
, SubscriptionCode
FROM openquery([' + @ServerSource + '],
''[Timestamp] = CAST([Timestamp] AS date)
, AppCode
, UserName
, EriAccountId
, [Count]= COUNT(MethodName)
, SubscriptionCode
FROM ' + @FromDatabase + '.dbo.[Log]
'
SELECT @SQL2 = N'
WHERE
(MethodName = ''''GetSalaryTable'''') OR
(MethodName = ''''GetSalaryByLevelTable'''') OR
(MethodName = ''''GetEmployees'''') OR
(MethodName = ''''GetBenchmarkList'''') OR
(MethodName = ''''GetAdvancedReport'''') OR
(MethodName = ''''GetGeoList'''') OR
(MethodName = ''''GetComparableCompanies'''') OR
(MethodName = ''''GetComparisonList'''') OR
(MethodName = ''''GetGAChart'''') OR
(MethodName = ''''GetOesData'''') OR
(MethodName = ''''GetTwoCityComparison'''') OR
(MethodName = ''''GetSalaryFromC3Norms'''') OR
(MethodName = ''''GetCoLs'''') OR
(MethodName = ''''GetPerDiems'''') OR
(MethodName = ''''GetTwoCityValues'''') OR
(MethodName = ''''DisabilityFilterJobs'''') OR
(MethodName = ''''ProcessAnalysis'''') OR
(MethodName = ''''GetFormTabs'''') OR
(MethodName = ''''GetReportDataForJob'''')
GROUP BY CAST(Timestamp AS date), AppCode, UserName, EriAccountId,
SubscriptionCode
HAVING
(SubscriptionCode IS NOT NULL)
AND (CAST(Timestamp AS date)) BETWEEN ''''' +
CONVERT(NVARCHAR,CAST(DateAdd(dd, +1, @startDate) AS DATE)) +''''' and
CAST(DateAdd(dd, -1, GETDATE()) AS DATE) '')
'
【问题讨论】:
-
您检查过产生的 SQL 语句吗?看起来它的引号太多了,有些似乎不平衡。
-
动态 SQL 和 openquery 需要这么多引号。在我看来这很荒谬
-
我认为您需要在
[Timestamp]之前添加一个SELECT。 -
@RazvanSocol 哇,就是这样!我完全错过了。谢谢,如果你想把它放在我会接受的答案中。
标签: sql sql-server tsql openquery