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