考虑一下:
CREATE PROCEDURE [dbo].[setIdentifier](@oldIdentifierName as varchar(50), @newIdentifierName as varchar(50))
AS
BEGIN
DECLARE @old_id as int;
DECLARE @new_id as int;
SET @old_id = (SELECT value FROM Configuration WHERE id = @oldIdentifierName);
SET @new_id = (SELECT value FROM Configuration WHERE id = @newIdentifierName);
IF @old_id IS NOT NULL AND @new_id IS NOT NULL
BEGIN
UPDATE Customer
SET type = @new_id
WHERE type = @old_id;
END;
END
[...]
EXECUTE dbo.setIdentifier '1', '2';
这样做是创建一个存储过程,该过程接受两个参数,然后用于更新客户表。
问题是上面的整个脚本在“dbo”以外的模式中运行。让我们假设架构是“company1”。当调用存储过程时,我从 SELECT 语句中得到一个错误,它说找不到配置表。我猜这是因为默认情况下 MS SQL 在与存储过程的位置相同的架构中查找表,而不是在调用上下文中。
我的问题是这样的:
- 是否有某种选项或参数或某种开关会告诉 MS SQL 在“调用者的默认模式”中查找表,而不是在存储过程本身的模式中查找表?
- 如果没有,你会推荐什么?我真的不想在表前面加上模式名称,因为这样做有点不灵活。所以我正在考虑使用动态 sql(以及即使在过程中也能返回正确值的 schema_name() 函数),但我对 MS SQL 的经验不足以构建正确的语法。