Ad-hoc SQL和内联函数给出不同的结果

时间:2015-04-07 23:54:38

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

在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')

我没有结果。知道为什么会这样吗?我考虑过许可问题,但据我所知,我完全有权执行该功能。

2 个答案:

答案 0 :(得分:2)

在SQL Server中,永远不要使用varchar()而不使用长度。将定义更改为:

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

并重新创建该功能。

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

答案 1 :(得分:0)

where子句“'SalesCRM'是否为空”的目的是什么?你能改写为

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

因此,表函数代码中的过滤器将是:

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