【发布时间】:2019-07-30 20:20:36
【问题描述】:
该函数是一个标量函数,返回nvarchar(1000),我是从LINQ to SQL调用它:
var allUserBranchIDs = appContext.DataContext.GetUserBranchIDs(appContext.PersonID, branchDelimiter);
它给出了这个错误:
找不到列“dbo”或用户定义的函数或聚合“dbo.GetUserBranchIDs”,或者名称不明确
当我从 SQL Server Management Studio 调用它时,它运行得很好:
select [dbo].[GetUserBranchIDs](3678, ',')
这表明 DataContext 正在使用的 SQL 用户存在权限问题 - 但我在 LINQ to SQL 中使用的 sa 用户与我在 SSMS 中的用户完全相同!
编辑:这是 LINQ to SQL 生成的方法:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.GetUserBranchIDs", IsComposable=true)]
public string GetUserBranchIDs([global::System.Data.Linq.Mapping.ParameterAttribute(Name="UserID", DbType="Int")] System.Nullable<int> userID, [global::System.Data.Linq.Mapping.ParameterAttribute(Name="Delimiter", DbType="NVarChar(10)")] string delimiter)
{
return ((string)(this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), userID, delimiter).ReturnValue));
}
编辑:函数定义:
CREATE FUNCTION [dbo].[GetUserBranchIDs]
(
@UserID int,
@Delimiter nvarchar(10) = '/'
)
RETURNS nvarchar(1000)
AS
BEGIN
declare @result nvarchar(1000) = null;
select @result = coalesce(@result, '') + cast(a.BranchID as nvarchar(10)) + @Delimiter
from (
select distinct
b.BranchID
from vw_UserBranchCurrent a
inner join vw_BranchDataCurrent b
on a.BranchID = b.BranchID
where
((@UserID is not null) and (a.UserID = @UserID))
) a;
set @result = left(@result, len(@result) - len(@Delimiter));
return @result;
END
【问题讨论】:
-
该 TSQL 查询看起来像一个标量值 UDF,但您的 LINQ 调用看起来需要一个表值 UDF。
-
在 SSMS 中运行代码会得到什么结果?
-
这不是权限问题。如果是这种情况,您的错误消息将大不相同。
-
@DavidBrowne-Microsoft 嗯,我只是将函数从服务器资源管理器拖到我的 DBML 文件中;我过去使用过其他标量值函数没有问题 - 我需要如何更改标量值函数的 LINQ 调用?
-
@ekolis 函数定义中的这一行告诉你它返回一个标量:
RETURNS nvarchar(1000)
标签: sql sql-server linq-to-sql