我有以下SP
PROCEDURE [dbo].[order_s]
(
@user Uniqueidentifier
)
AS
BEGIN
SET NOCOUNT ON;
SELECT
id,
name,
[begin],
[end]
FROM
orders
WHERE
@user = dbo.hasAccess(@user,id,'select')
END
这个 SP 调用这个 UDF
FUNCTION [dbo].[hasAccess]
(
@user uniqueidentifier,
@orderId bigint,
@AccessType nchar(10)
)
RETURNS uniqueidentifier
AS
BEGIN
DECLARE @Result uniqueidentifier
SELECT
Top 1 @Result = [user]
FROM
access
WHERE
orderId = @orderId AND
[user] = @user AND
role >= CASE
WHEN @AccessType = 'select' then 1
WHEN @AccessType = 'insert' then 5
WHEN @AccessType = 'update' then 7
WHEN @AccessType = 'delete' then 10
END
RETURN @Result
END
我的问题是,从 SP 调用 UDF 有任何性能问题吗? 有没有更好的方法来实现相同的功能?
感谢您的建议...
最佳答案
是的,这是对标量 UDF 的错误使用。这应该表现得更好。
SELECT
id,
name,
[begin],
[end]
FROM
orders o
WHERE EXISTS(
SELECT *
FROM access
WHERE orderId = o.id AND [user] = @user AND role >= 1
)
关于sql - ms sql 上 SP 性能问题中的 UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780593/