将参数发送到sp_exec_remote调用时,正确的SQL语法是什么?

时间:2016-06-12 14:58:03

标签: tsql azure-sql-database

使用sp_exec_remote将参数传递给远程SPROC调用时遇到问题。这种语法有什么问题?

EXEC sp_execute_remote N'DevelopmentDBQueryDataSrc', N'pSelect_tReport', N'@StartDate datetime', @StartDate, N'@EndDate datetime', @EndDate

根据MS文件:

 sp_execute_remote [ @data_source_name = ] datasourcename [ , @stmt = ] statement  [ { , [ @params = ] N'@parameter_name data_type [,...n ]' } { , [ @param1 = ] 'value1' [ ,...n ] }] 

我一直收到这个错误:

Error retrieving data from shard [DataSource[mydatasource-hidden].database.windows.net Database=Development].  The underlying error message received was: 'Procedure or function  has too many arguments specified.'.

以下是SPROC声明:

CREATE PROCEDURE [dbo].[pSelect_tReport] (@StartDate datetime,@EndDate datetime) AS ...

附加信息: 这是在Azure上使用弹性查询。已创建,设置和测试权限和主密钥。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = <password>'; 
CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred 
WITH IDENTITY = <user>, 
SECRET = <password>;

CREATE EXTERNAL DATA SOURCE DBQueryDataSrc WITH 
    (TYPE = RDBMS, 
    LOCATION = 'myserver.database.windows.net', 
    DATABASE_NAME = 'MyDatabaseName', 
    CREDENTIAL = ElasticDBQueryCred, 
) ;

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

行。我想到了。它与语法有关。需要在第一个nvarchar字符串中的SPROC名称后面再次列出参数:

EXEC sp_execute_remote N'DevelopmentDBQueryDataSrc',
                   N'pSelect_tReport @StartDate, @EndDate',
                   N'@StartDate datetime, @EndDate datetime',
                   @StartDate=@StartDate, @EndDate=@EndDate;

这会奏效。它花了一些试验和错误,但我终于得到了它。谢谢你帮助我得出这个结论。我希望将来可以帮助其他人。

答案 1 :(得分:0)

我没有使用sp_execute_remote,但我猜它遵循与sp_executesql相同的约定:

EXEC sp_execute_remote N'DevelopmentDBQueryDataSrc',
                       N'pSelect_tReport',
                       N'@StartDate datetime, @EndDate datetime',
                       @StartDate=@StartDate, @EndDate=@EndDate;

也就是说,一个参数是一个包含所有参数定义的字符串。然后参数作为单独的参数。