找不到列“ dbo”或用户定义的函数或聚合“ dbo.GetUserBranchIDs”,或者名称不明确

时间:2019-07-30 20:20:36

标签: 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调用它时,它运行得很好:

select [dbo].[GetUserBranchIDs](3678, ',')

这暗示了DataContext使用的SQL用户的权限问题-但我在LINQ to SQL中使用的是与SSMS中相同的sa用户!

编辑:这是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

2 个答案:

答案 0 :(得分:2)

我要说的是检查您在脚本中使用的当前数据库目录与在Sql Server Management Studio(SSMS)中使用的目录。

select DB_NAME()

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

https://stackoverflow.com/a/15420524/2256278

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 + '%'

希望这会有所帮助。

答案 1 :(得分:1)

好的,我是个白痴……我以为我在使用一个数据库,但实际上我在使用另一个数据库(在三种环境(开发/测试/生产)中,每个客户端都有一个单独的数据库)。这就是缺少该功能的原因-我已将其添加到错误的数据库中!