2015-04-07 11 views
0

В MS SQL Server 2012 SP1, когда я Execute: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

В чем заключается цель, при которой пункт «« SalesCRM «IS NULL»? Вы можете просто переписать в виде

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

Поэтому фильтр в коде функции таблицы будет:

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

Дело в том, чтобы вернуть все строки (без фильтрации), если '@ AppName' является' NULL'. –

 Смежные вопросы

  • Нет связанных вопросов^_^