2015-04-07 35 views
0

在MS SQL Server 2012 SP1,当我执行:即席SQL和内联函数给出不同的结果

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

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

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

并重新创建该功能。

在此情况下,默认长度为1,因此该值将作为'S'传入。

+0

这绝对是答案。我已经验证该解决方案的工作原理。 – prmph

0

where子句“'SalesCRM'IS NULL”的用途是什么?你可以改写为

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

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

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

如果'@ AppName'为'NULL',则返回所有行(不过滤)。 –

相关问题