Sql 找不到任何一列";dbo“;或用户定义的函数或聚合;dbo.GetUserBranchIDs“;,或者名称不明确

Sql 找不到任何一列";dbo“;或用户定义的函数或聚合;dbo.GetUserBranchIDs“;,或者名称不明确,sql,sql-server,linq-to-sql,Sql,Sql Server,Linq To Sql,该函数是一个标量函数,返回nvarchar(1000),我从LINQ到SQL调用它: var allUserBranchIDs = appContext.DataContext.GetUserBranchIDs(appContext.PersonID, branchDelimiter); 它给出了这个错误: 找不到列“dbo”或用户定义函数或聚合“dbo.GetUserBranchIDs”,或者名称不明确 当我从SQL Server Management Studio调用它时,它运行正常: s

该函数是一个标量函数,返回
nvarchar(1000)
,我从LINQ到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中使用的是与SSMS中完全相同的
sa
user

编辑:以下是LINQ到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));
}

好吧,我是个十足的白痴。。。我以为我在使用一个数据库,但实际上我在使用另一个数据库(在三个环境中,每个客户机都有一个单独的数据库:dev/test/prod)。这就是函数丢失的原因-我将它添加到了错误的数据库中

我想说的是检查脚本中使用的当前DB目录与Sql Server Management Studio(SSMS)中使用的目录

然后,一旦知道当前数据库,您可以创建另一个脚本,以确认哪些用户定义的函数可用于该目录,使用类似于本文的内容,但需要进行修改以允许函数名称匹配:


希望这有帮助。

TSQL查询看起来像标量值的UDF,但LINQ调用看起来像是需要表值的UDF。在SSMS中运行代码时会得到什么结果?这不是权限问题。如果是这样的话,您的错误消息将大不相同。@DavidBrowne-Microsoft-hmm,我刚刚将函数从服务器资源管理器拖到我的DBML文件中;我过去使用过其他标量值函数,没有问题-我需要如何更改标量值函数的LINQ调用?@ekolis函数定义中的这一行告诉您它返回标量:
返回nvarchar(1000)
我认为你应该回答自己的问题,并表明你在回答自己的问题。这是这里的标准礼仪吗?我不知道。。。。
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
select DB_NAME()
DECLARE @yourFunctionGuessValue nvarchar(200) = 'someFunctionNamePart'
SELECT name, definition, type_desc 
FROM sys.sql_modules m 
INNER JOIN sys.objects o 
    ON m.object_id=o.object_id
WHERE type_desc LIKE '%function%'
and name LIKE '%' + @yourFunctionGuessValue + '%'