【问题标题】:OPENQUERY throws error when used with WIN2K8\SQL2K12与 WIN2K8\SQL2K12 一起使用时,OPENQUERY 会引发错误
【发布时间】:2015-01-06 12:53:40
【问题描述】:

我正在尝试使用以下 Sql 查询将我的存储过程结果移动到表中

SELECT *
  INTO #tmpTable
FROM OPENQUERY(WIN2K8\SQL2K12, 'EXEC vcs_gauge  @gauge_name=vs1_bag,@first_rec_time=2014-09-01 09:00:00,@last_rec_time=2014-09-01 10:00:00')

执行查询时引发以下错误。

'\' 附近的语法不正确。

我不想添加链接服务器。如何解决这个问题?

EDIT1

当我做[win2k8\sql2k12]时,先执行如下命令

EXEC sp_serveroption 'YourServer', 'DATA ACCESS', TRUE

新消息来了

链接服务器“WIN2K8\SQL2K12”的 OLE DB 提供程序“SQLNCLI11”返回消息“延迟准备无法完成。”。 消息 8180,第 16 层,状态 1,第 1 行 无法准备报表。 消息 102,第 15 级,状态 1,第 1 行 '-' 附近的语法不正确。

【问题讨论】:

  • OPENQUERY 用于对链接服务器执行 sql。第一个参数是链接服务器的名称。 WIN2K8\ SQL2K12 是您的链接服务器的名称吗?如果确实如此,那么您需要使用括号[WIN2K8\ SQL2K12]
  • @MikaelEriksson 在执行 [WIN2K8\SQL2K12] 后,显示错误 Server 'WIN2K8\SQL2K12' is not configured for DATA ACCESS

标签: sql-server-2012 openquery


【解决方案1】:

您需要将 DATETIME 值括在单引号中。而且由于您的查询本身是一个字符串,因此这些单引号需要按如下方式加倍/转义(您可能还应该将第一个参数的值放在转义单引号中,因为它显然是一个字符串)。

您还应该使用[DatabaseName].[SchemaName]. 完全限定存储过程名称。

由于vcs_gauge proc 使用动态SQL,您需要指定WITH RESULT SETS 子句。有关此条款的更多信息,请参阅 EXECUTE 的 MSDN 页面。

SELECT *
INTO #tmpTable
FROM OPENQUERY([WIN2K8\SQL2K12],
             N'EXEC [DatabaseName].[SchemaName].vcs_gauge
                      @gauge_name = ''vs1_bag'',
                      @first_rec_time = ''2014-09-01 09:00:00'',
                      @last_rec_time = ''2014-09-01 10:00:00''
               WITH RESULT SETS ( { column_specification} );
             ');

【讨论】:

  • Msg 11529, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1 由于每个代码路径都会导致错误,因此无法确定元数据;请参阅之前的一些错误。消息 2812,级别 16,状态 62,过程 sp_describe_first_result_set,第 1 行找不到存储过程 'vcs_gauge'。 当我用你提到的引号将日期时间值括起来时,会显示错误。
  • @srutzly 现在出现以下错误 Msg 11514, Level 16, State 1, Procedure sp_describe_first_result_set, Line 1 元数据无法确定,因为语句 'EXEC ('WITH C AS ('+@ query+') SELECT '+@column_str2+',Avg_Pressure,st1_ring_avg_press' in procedure 'vcs_gauge' 包含动态 SQL。考虑使用 WITH RESULT SETS 子句显式描述结果集
  • @SRY_JAVA 好的。这是一个非常具体的错误消息。你做了建议吗?由于该过程使用动态 SQL,您唯一的选择是指定 WITH RESULT SETS 子句。
  • 我没有提出建议,因为我不知道如何将 RESULT SET 与 SQl 查询一起使用,而且我没有从存储过程中检索到的所有列的数据类型。有吗有什么其他方法可以解决吗?
  • @SRY_JAVA 我更新了一个基本示例并提供了指向 MSDN 文档的链接。它只是一个标准列+数据类型列表,就像CREATE TABLE。如果您不知道数据类型,是否可以临时更新 proc 以在 SELECT 之前添加“INSERT INTO ##temp”,然后运行一次,然后运行EXEC tempdb.dbo.sp_help N'##temp';
猜你喜欢
  • 2021-06-07
  • 2014-08-11
  • 2021-08-13
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多