【问题标题】:Ad-hoc SQL and inline function giving different resultsAd-hoc SQL 和内联函数给出不同的结果
【发布时间】:2015-04-07 23:54:37
【问题描述】:

在 MS SQL Server 2012 SP1 中,当我执行时:

SELECT  rt.RoleId, ur.RoleName, app.ApplicationName
FROM    [TV_ClientPortal].[dbo].[UserRoleTie] rt
            JOIN [TV_ClientPortal].[dbo].[UserRoles] ur
                ON rt.RoleId = ur.RoleId
            JOIN [TV_ClientPortal].[dbo].[Applications] app
                ON app.ApplicationId = ur.ApplicationId
WHERE   rt.UserId = 255 AND
        ('SalesCRM' IS NULL OR app.ApplicationName = 'SalesCRM')

我得到一排。现在我写了一个内联函数:

CREATE FUNCTION dbo.Func_GetRolesForUser 
(   
    @UserId int,
    @AppName varchar
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT  rt.RoleId, ur.RoleName, app.ApplicationName
    FROM    [TV_ClientPortal].[dbo].[UserRoleTie] rt
                JOIN [TV_ClientPortal].[dbo].[UserRoles] ur
                    ON rt.RoleId = ur.RoleId
                JOIN [TV_ClientPortal].[dbo].[Applications] app
                    ON app.ApplicationId = ur.ApplicationId
    WHERE   rt.UserId = @UserId AND
            (@AppName IS NULL OR app.ApplicationName = @AppName)
)
GO

但是当我执行时

SELECT * FROM dbo.Func_GetRolesForUser(255, 'SalesCRM')

我没有得到任何结果。知道为什么会这样吗?我考虑过权限问题,但据我所知,我拥有执行该功能的完全权限。

【问题讨论】:

    标签: sql sql-server-2012 adhoc-queries udf


    【解决方案1】:

    在 SQL Server 中,切勿使用没有长度的 varchar()。将定义更改为:

    CREATE FUNCTION dbo.Func_GetRolesForUser 
    (   
        @UserId int,
        @AppName varchar(255)
    )
    

    然后重新创建函数。

    在此上下文中,默认长度为 1,因此该值作为 'S' 传入。

    【讨论】:

    • 这绝对是答案。我已验证该解决方案有效。
    【解决方案2】:

    where 子句“'SalesCRM' IS NULL”的目的是什么?你能改写成

    (app.ApplicationName IS NULL OR app.ApplicationName = 'SalesCRM')
    

    因此,您的表格功能代码中的过滤器将是:

    (app.ApplicationName IS NULL OR app.ApplicationName = @AppNam)
    

    【讨论】:

    • 如果@AppNameNULL,则返回所有行(不过滤)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多