【问题标题】:Call stores procedure from another database and insert the data in the remote database in Azure从另一个数据库调用存储过程并将数据插入 Azure 中的远程数据库
【发布时间】:2017-01-19 14:12:22
【问题描述】:

我在 azure 中有 2 个数据库 db1 和 db2。 db1 有存储过程stored_p1, db2 有存储过程stored_p2。 从stored_p2 调用stored_p1。 为了从另一个数据库调用表,使用外部源和外部表。 外部表仅适用于 DDL。但是在stored_p2中调用stored_p1时需要将数据插入到db1中的表中。远程数据库(db1)上的表有标识列。

由于外部表是 DDL,有没有办法将数据插入实际表而不是外部表。

【问题讨论】:

  • 感谢伊恩您的回复。让我说清楚。如何调用 Azure 远程数据库中的存储过程。 SP_execute_remote 的任何示例都会有所帮助。

标签: azure


【解决方案1】:

如果我正确理解您的问题,您可以使用作为弹性数据库的一部分引入的 sp_execute_remote 函数。

文档在这里: https://msdn.microsoft.com/en-us/library/mt703714.aspx

sp_execute_remote 如何在我理解的您的设置中使用的示例如下所示:

订阅 1,DB1 有这个表和存储过程:

CREATE TABLE [dbo].[tblNames](
    [id] [smallint] IDENTITY(1,1) NOT NULL,
    [FirstName] [varchar](50) NULL,
    [Surname] [varchar](255) NULL,
 CONSTRAINT [PK_tblNames] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

GO

CREATE PROCEDURE [dbo].[sp_Insert_New_Name] @FirstName varchar(50), @Surname varchar(255)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO tblNames VALUES (@FirstName, @Surname)

END

GO

订阅 2,有 DB2 这个存储过程:

CREATE PROCEDURE sp_Insert_Name_via_Remote_SP
    @FN varchar(50), @SN varchar(255)
AS
BEGIN

    SET NOCOUNT ON;
EXEC sp_execute_remote @data_source_name  = N'dsRemoteDbinRemoteSub', 
@stmt = N'sp_Insert_New_Name @FirstName, @Surname', 
@params = N'@FirstName varchar(50), @Surname varchar(255)',
@FirstName = @FN, @Surname = @SN

END
GO

在 Subscription 2,DB2 我运行这个命令:

exec sp_insert_name_via_remote_sp 'FN5', 'SN5'

这成功地插入到 Subscription 1 和 DB1 中的表中。

注意我在这里的第一次尝试使用了输出变量,因此您可以返回插入的标识,但 sp_execute_remote 似乎不支持输出变量。

为了完整起见,下面的代码在第二个数据库中用于配置远程数据源:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Password>';

 CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred
 WITH IDENTITY = '<DB username>',
 SECRET = '<DB password>';


 CREATE EXTERNAL DATA SOURCE dsRemoteDbinRemoteSub
    WITH (   
        TYPE = RDBMS,  
        LOCATION = '<DB Server Name>.database.windows.net',  
        DATABASE_NAME = '<DB Name>',  
        CREDENTIAL = ElasticDBQueryCred 
    )  

希望对你有帮助

【讨论】:

  • 感谢您的宝贵时间,伊恩。这对我有帮助。
猜你喜欢
  • 2016-07-23
  • 2012-03-18
  • 2017-12-25
  • 2023-04-10
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多