引用标量UDF中的表 - 与模式名称绑定?

时间:2014-11-19 15:35:16

标签: sql sql-server sql-server-2008 user-defined-functions

由于我们系统的推出/架构,我想创建一个标量UDF,以便在存储过程的SELECT语句中使用

因为我们的各种DEV / TEST / LIVE环境具有不同的模式名称,所以我最好将我的UDF命名为dbo.MyFunctionName,因为我的函数包含使用SELECT语句从中获取值的逻辑一个数据库表返回答案,这意味着我不能使用dbo但必须把它放在数据库的模式下(即:TEST) 注意 - 这是对的,对吗?

SELECT语句调用函数时,必须提供由两部分组成的名称,因此我必须使用TEST.MyFunctionName

SELECT Name, Age, TEST.MyFunctionName(PersonID) FROM People

有没有办法参数化模式名称,以便当我将其推出到不同的模式时,我不需要在每个模式下创建函数和/或修改它的调用方式?理想情况下,我正在寻找像

这样的东西
SELECT Name, Age, SCHEMA_NAME().MyFunctionName(PersonID) FROM People

但我想尽可能不使用动态SQL

非常感谢

2 个答案:

答案 0 :(得分:0)

你的问题实际上是两个问题:

  • 我的函数是否需要与它所选择的表具有相同的模式?答案是dbo.MyFunction()可以从test.MyTable中选择就好了。但是,您可能会遇到所有权链接问题 - 不同的模式意味着必须存在显式权限才能让用户从表中进行选择。有关详细信息,请参阅Books Online
  • 我可以使用参数化架构调用函数,而不使用动态SQL吗?答案是。对象名称是静态的 - 虽然SQL确实具有延迟名称解析形式的“功能”,允许您引用存储过程中的对象,即使它们不存在,但这仍然不允许您创建模式名称变量。

答案 1 :(得分:0)

我会更加高度建议将架构更改为不同的服务器(理想情况下 - 保持实例/数据库/架构名称相同),否则不同实例(不太理想,但保留数据库/模式名称相同),或至少在不同的数据库(甚至不太理想,但保持模式名称相同)。从纯粹的编码和测试角度来看,您正在混合测试和生产代码和数据。这是容易犯错误和跨数据交叉模式的方法。为什么迫使生产遭受开发中的性能问题?您甚至无法单独备份/恢复dev。即使这些不同的模式位于不同的数据库或服务器中,从QA的角度来看,您在“dev”中测试的代码正在部署到生产中的代码。

但是,通过使用不同的用户,您可以在没有太多欺骗的情况下完成此任务。每个用户都有一个默认架构。如果您有三个用户:DevUser,TestUser和LiveUser,每个用户都有各自的默认架构,那么在引用对象时,您只需使用架构名称。 SQL Server将首先检查默认架构。这样,每个用户都可以获得各自的对象。