考虑一下:
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';
这样做是创建一个存储过程,接受两个参数然后用它来更新Customer表。
问题是上面的整个脚本在“dbo”以外的模式中运行。我们假设架构是“company1”。当调用存储过程时,我从SELECT语句中得到一个错误,该错误表示无法找到配置表。我猜这是因为默认情况下MS SQL在与存储过程的位置相同的模式中查找表,而不是在调用上下文中查找。
我的问题是:
答案 0 :(得分:0)
显式指定架构名称会更有效。一般来说,模式主要用于将数据库划分为逻辑区域。我不会经常看到表格跳帧。
关于您的问题,您可能希望查看msdn上的“execute as”文档,因为它允许显式控制您的执行上下文。
答案 1 :(得分:0)
我最终将模式名称作为“sqlcmd”命令的命令行上的属性传递给我的脚本。像这样:
C:/> sqlcmd -vSCHEMANAME=myschema -imysqlfile
在SQL脚本中,我可以像这样访问这个变量:
SELECT * from $(SCHEMANAME).myTable WHERE.... etc
不像动态sql那么灵活,但是“足够好”。
感谢所有人花时间回复。