【问题标题】:Passing parameters to a OPENQUERY将参数传递给 OPENQUERY
【发布时间】:2019-09-16 11:55:25
【问题描述】:

为什么下面的查询不起作用?它给了我错误:'+'附近的语法不正确。

SELECT  *
INTO    #tmpTable
FROM OPENQUERY("127.0.0.1", 'EXEC [DB].dbo.SP_inventory' +  @StoreId + ',' + @StartDate ',' +  @EndDate)

我应该如何传递参数 @StoreId @StartDate@EndDate 以使其正常工作?谢谢。

【问题讨论】:

  • OPENQUERY 不接受表达式,只接受字符串常量。您可以“干净地”将参数传递给远程存储过程(即不构建字符串并涉及类型转换),但是您应该使用 EXECUTE ... AT 并使用 ? 语法作为参数。
  • 刚刚意识到这是相关的:Is the sp_ prefix still a no-no?

标签: sql-server stored-procedures


【解决方案1】:

OPENQUERY 需要文字;它不能是一种表达。如果需要传递参数。一种方法是使用动态 SQL,但它会变得“丑陋”。这是不完整的,因为我们所拥有的是然而

DECLARE @StoreId int = 7,
        @StartDate date = '20190101',
        @EndDate date = '20190701';
--Values shoukd be set

DECLARE @SQL nvarchar(MAX);
DECLARE @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = N'{SELECT Statement parts}' + @CRLF + 
           N'FROM OPENQUERY("172.16.111.11", N''EXEC [DB].dbo.SP_inventory' +  CONVERT(varchar(10),@StoreId) + ',' + QUOTENAME(CONVERT(varchar,@StartDate,112),'''') + ',' +  QUOTENAME(CONVERT(varchar,@EndDate,112),'''') +') OQ';

PRINT @SQL; --Your best Friend
EXEC sp_executesql @SQL;

因此,另一种方法是使用EXECUTE ... AT,这需要链接服务器:

EXEC (N'[DB].dbo.SP_inventory ?, ?, ?;',@StoreId, @StartDate, @EndDate) AT [{Linked Server Name}];

【讨论】:

  • 那么我怎样才能将EXEC (N'[DB].dbo.SP_inventory ?, ?, ?;',@StoreId, @StartDate, @EndDate) AT [{Linked Server Name}];SELECT 一起使用到临时表中呢?
  • 请注意,如果涉及的存储过程也存在于 SQL Server 上,则可以使用@param1 = ?, @param2 = ?, ... 按名称而不是序号位置分配参数值,这样更健壮。 (当然,这同样适用于原始查询。)
  • 我想使用OPENQUERY 的原因是,我想在FROM 关键字之后使用SELECT 语句将存储过程中的返回值插入到临时表中。你给我的解决方案在FROM之后不起作用。
  • 如果您知道结果集的结构,您可以使用INSERT .. EXEC AT(有一些注意事项,请参阅here)。如果您不能依赖结果集的结构,则将基于文本的动态查询与OPENQUERY 组合在一起是您唯一的办法。但是,这可能会变得非常难看,因为您需要一个全局临时表,或者将整个查询提升为动态查询。
  • 我无法弄清楚如何使用撇号来格式化我的 OPENQUERY 语句,与您第一个示例中应用于我的查询的逻辑相同,只是不起作用,我无法创建有效的字符串.我创造了这样的东西; OPENQUERY("172.16.111.11", N'EXEC [DB].dbo.SP_inventory' + CONVERT(varchar(10),@StoreId) + ',' + QUOTENAME(CONVERT(varchar,@StartDate)) + ',' + QUOTENAME(CONVERT(varchar,@EndDate)))
猜你喜欢
  • 2019-04-30
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
相关资源
最近更新 更多