2015-04-07 70 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',則返回所有行(不過濾)。 –

相關問題