由于我们系统的推出/架构,我想创建一个标量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
非常感谢
答案 0 :(得分:0)
你的问题实际上是两个问题:
dbo.MyFunction()
可以从test.MyTable
中选择就好了。但是,您可能会遇到所有权链接问题 - 不同的模式意味着必须存在显式权限才能让用户从表中进行选择。有关详细信息,请参阅Books Online。答案 1 :(得分:0)
我会更加高度建议将架构更改为不同的服务器(理想情况下 - 保持实例/数据库/架构名称相同),否则不同实例(不太理想,但保留数据库/模式名称相同),或至少在不同的数据库(甚至不太理想,但保持模式名称相同)。从纯粹的编码和测试角度来看,您正在混合测试和生产代码和数据。这是容易犯错误和跨数据交叉模式的方法。为什么迫使生产遭受开发中的性能问题?您甚至无法单独备份/恢复dev。即使这些不同的模式位于不同的数据库或服务器中,从QA的角度来看,您在“dev”中测试的代码不正在部署到生产中的代码。
但是,通过使用不同的用户,您可以在没有太多欺骗的情况下完成此任务。每个用户都有一个默认架构。如果您有三个用户:DevUser,TestUser和LiveUser,每个用户都有各自的默认架构,那么在引用对象时,您只需不使用架构名称。 SQL Server将首先检查默认架构。这样,每个用户都可以获得各自的对象。