Ad-hoc SQL 和内联函数给出不同的结果
Ad-hoc SQL and inline function giving different results
在 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')
我没有得到任何结果。知道为什么会这样吗?我考虑过权限问题,但据我所知,我有执行该功能的完全权限。
where 子句“'SalesCRM' IS NULL”的用途是什么?你能改写成
吗
(app.ApplicationName IS NULL OR app.ApplicationName = 'SalesCRM')
因此,您的 table 函数代码中的过滤器将是:
(app.ApplicationName IS NULL OR app.ApplicationName = @AppNam)
在SQL服务器中,切勿使用没有长度的varchar()
。将定义更改为:
CREATE FUNCTION dbo.Func_GetRolesForUser
(
@UserId int,
@AppName varchar(255)
)
并重新创建函数。
在此上下文中,默认长度为 1,因此值作为 'S'
.
传入
在 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')
我没有得到任何结果。知道为什么会这样吗?我考虑过权限问题,但据我所知,我有执行该功能的完全权限。
where 子句“'SalesCRM' IS NULL”的用途是什么?你能改写成
吗(app.ApplicationName IS NULL OR app.ApplicationName = 'SalesCRM')
因此,您的 table 函数代码中的过滤器将是:
(app.ApplicationName IS NULL OR app.ApplicationName = @AppNam)
在SQL服务器中,切勿使用没有长度的varchar()
。将定义更改为:
CREATE FUNCTION dbo.Func_GetRolesForUser
(
@UserId int,
@AppName varchar(255)
)
并重新创建函数。
在此上下文中,默认长度为 1,因此值作为 'S'
.