从存储过程中的不同模式中选择数据

时间:2013-06-04 07:49:50

标签: sql sql-server

考虑一下:

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在与存储过程的位置相同的模式中查找表,而不是在调用上下文中查找。

我的问题是:

  1. 是否有某种选项或参数或某种类型的开关 告诉MS SQL在“调用者的默认模式”中查找表 不在程序本身存储的架构中?
  2. 如果没有, 你会推荐什么?我真的不想在表格前加上前缀 使用模式名称,因为它有点不灵活 那。所以我在考虑使用动态sql(和schema_name() 即使在程序中也返回正确值的函数), 但我只是没有经验丰富的MS SQL来构建 正确的语法。

2 个答案:

答案 0 :(得分:0)

显式指定架构名称会更有效。一般来说,模式主要用于将数据库划分为逻辑区域。我不会经常看到表格跳帧。

关于您的问题,您可能希望查看msdn上的“execute as”文档,因为它允许显式控制您的执行上下文。

答案 1 :(得分:0)

我最终将模式名称作为“sqlcmd”命令的命令行上的属性传递给我的脚本。像这样:

C:/> sqlcmd -vSCHEMANAME=myschema -imysqlfile

在SQL脚本中,我可以像这样访问这个变量:

SELECT * from $(SCHEMANAME).myTable WHERE.... etc

不像动态sql那么灵活,但是“足够好”。

感谢所有人花时间回复。