【问题标题】:Cannot find either column "dbo" or the user-defined function or aggregate "dbo.GetUserBranchIDs", or the name is ambiguous找不到列“dbo”或用户定义的函数或聚合“dbo.GetUserBranchIDs”,或者名称不明确
【发布时间】: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


【解决方案1】:

我要说的是检查您在脚本中使用的当前数据库目录与您在 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 + '%'

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    好吧,我是个彻头彻尾的白痴……我以为我在使用一个数据库,但实际上我在使用另一个(我们在三个环境中的每个环境中每个客户端都有一个单独的数据库:dev/test/prod)。这就是缺少该功能的原因 - 我已将其添加到错误的数据库中!

    【讨论】:

    • 我认为你应该edit你的答案并表明你正在回答你自己的问题。
    • 这是这里的标准礼仪吗?我没有意识到这一点......
    猜你喜欢
    • 2015-05-26
    • 2020-12-07
    • 2014-01-06
    • 2019-08-01
    • 2011-01-06
    • 2019-02-09
    • 1970-01-01
    • 2016-01-10
    • 2011-07-13
    相关资源
    最近更新 更多