Sql-Server

當從另一個上下文呼叫時,過程在哪個上下文中執行?

  • October 10, 2018

考慮:

use databaseA;
go

exec databaseB.dbo.spProcedure();
go

該過程是否針對 databaseA(呼叫它的上下文)或 databaseB(它所在的上下文)執行?

如果程序有

insert into myTable(example) values ('example');

…如果兩個數據庫都有相同的表 myTable,哪個數據庫將接收新記錄?

它在對象所在的數據庫的上下文中執行。範常式式碼:

CREATE DATABASE Temp1
GO
USE [temp1]
GO
CREATE TABLE Data1 (Val VARCHAR(255))
GO
INSERT INTO Temp1.dbo.Data1 (Val)
VALUES ('Test1')
GO
CREATE PROCEDURE spTemp1
AS
BEGIN
   SELECT * FROM dbo.Data1
END
GO


CREATE DATABASE Temp2
GO
USE [temp2]
GO
CREATE TABLE Data1 (Val VARCHAR(255))
GO
INSERT INTO Temp2.dbo.Data1 (Val)
VALUES ('Test2')
GO
CREATE PROCEDURE spTemp2
AS
BEGIN
   SELECT * FROM dbo.Data1
END
GO

USE [Temp1]
GO
EXEC Temp2.dbo.spTemp2
GO

USE [master]
GO
DROP DATABASE Temp1
DROP DATABASE Temp2
GO

這突出表明,即使我們查詢兩個數據庫中都存在的“dbo.Data1”,但返回的值來自 Temp2 數據庫中的該表,因為這是儲存過程的上下文。

該範例是一個 SELECT,但對於 INSERT 也是如此。

引用自:https://dba.stackexchange.com/questions/219714