0

考虑一下:

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

我的问题是这样的:

  1. 是否有某种选项或参数或某种开关会告诉 MS SQL 在“调用者的默认模式”中查找表,而不是在存储过程本身的模式中查找表?
  2. 如果没有,你会推荐什么?我真的不想在表前面加上模式名称,因为这样做有点不灵活。所以我正在考虑使用动态 sql(以及即使在过程中也能返回正确值的 schema_name() 函数),但我对 MS SQL 的经验不足以构建正确的语法。
4

2 回答 2

0

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

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

于 2013-06-04T08:17:43.147 回答
0

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

C:/> sqlcmd -vSCHEMANAME=myschema -imysqlfile

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

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

不如动态 sql 灵活,但“足够好”。

感谢大家花时间回复。

于 2013-06-07T12:38:36.367 回答