【问题标题】:OpenQuery Statement could not be prepared无法准备 OpenQuery 语句
【发布时间】: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


【解决方案1】:

在[Timestamp] 之前需要一个SELECT。

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 2016-10-15
    • 2021-04-26
    • 1970-01-01
    • 2018-03-14
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多