【问题标题】:Function name is ambigious in SQL serverSQL server 中的函数名不明确
【发布时间】:2019-08-29 13:49:26
【问题描述】:

基于this 问题,我创建了一个函数并将其添加到我的数据库中。现在我想将该函数用作计算列:

-- Based on https://stackoverflow.com/a/1012802/10406502 (work by Even Mien)
CREATE FUNCTION [dbo].[StripCharacters]
(
    @String NVARCHAR(MAX), 
    @MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
    SET @MatchExpression =  '%['+@MatchExpression+']%'

    WHILE PatIndex(@MatchExpression, @String) > 0
        SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')

    RETURN @String

END
GO

-- Table
CREATE TABLE [dbo].[Trailer]
(
    [ID] INT NOT NULL PRIMARY KEY IDENTITY,
    [ID_Hauler] INT NULL,
    [RegistrationNumber] NCHAR(9) NOT NULL,
    [RegistrationNumberSimplified] AS [dbo].StripCharacters([RegistrationNumber], '^A-Z0-9'),
    [MaxLoad] FLOAT NULL,

    CONSTRAINT [FK_Hauler_Trailer] FOREIGN KEY ([ID_Hauler]) REFERENCES [Hauler]([ID]),
    CONSTRAINT [UC_RegistrationNumber] UNIQUE ([RegistrationNumberSimplified])
)

但是,我引用该函数的行会引发错误:

“Berechnete Spalte:[dbo].[Trailer].[RegistrationNumberSimplified]” enthält einen nicht aufgelösten Verweis auf ein Objekt。纠缠不清 das Objekt nicht vorhanden, oder der Verweis ist mehrdeutig, da er auf die folgenden Objekte verweisen könnte: [dbo].[StripCharacters] oder [dbo].[Trailer].[dbo]::[StripCharacters].

“要么对象不存在,要么引用不明确,因为它可能表示 [dbo].[StripCharacter] 或 [dbo].[Trailer].[dbo]::[StripCharacter]。”

我也尝试让服务器猜测函数的命名空间。在这种情况下,数据库会抛出错误:

(57,1):SQL72014:.Net SqlClient 数据提供者:Meldung 195、Ebene 15、 状态 10,Zeile 11 'StripCharacters' 不是公认的内置 函数名。

这里有什么问题?

我也找到了this的问题,但答案对我没有帮助,因为我不使用数据库引用。

【问题讨论】:

  • StripCharacters 存在于两个不同的 schamas 中,第一个在 dbo 下,第二个在 [dbo].[Trailer].[dbo]
  • @AmiraBedhiafi 但是为什么呢?错误发生在 Visual Studio 数据库项目中,并且我定义该函数的唯一位置是在 SQL 文件中,其代码与 Amy 在链接问题中的帖子中的代码完全相同。
  • 尝试删除 [dbo].StripCharacters 并运行查询以了解有关问题的更多信息
  • 即便如此,如果你修复它,你会得到这个error,因为它是一个nvarchar(MAX)。改变它,你就会得到这个error(我已经在你的另一个问题中警告过你了)。
  • 确定吗?如果您的名称错误,您会得到您描述的错误:db<>fiddle

标签: sql-server tsql calculated-columns visual-studio-2019 database-project


【解决方案1】:

您遇到的问题是该函数返回的值太大而无法用作键列。最大值为 NVARCHAR(850) 或 VARCHAR(1700)。这会起作用:

-- Based on https://stackoverflow.com/a/1012802/10406502 (work by Even Mien)
ALTER FUNCTION [dbo].[StripCharacters]
(
    @String NVARCHAR(850), 
    @MatchExpression VARCHAR(255)
)
RETURNS NVARCHAR(850) WITH SCHEMABINDING 
AS
BEGIN
    SET @MatchExpression =  '%['+@MatchExpression+']%'

    WHILE PatIndex(@MatchExpression, @String) > 0
        SET @String = Stuff(@String, PatIndex(@MatchExpression, @String), 1, '')

    RETURN @String
END
GO

-- Table
CREATE TABLE [dbo].[Trailer]
(
    [ID] INT NOT NULL PRIMARY KEY IDENTITY,
    [ID_Hauler] INT NULL,
    [RegistrationNumber] NCHAR(9) NOT NULL,
    [RegistrationNumberSimplified] AS [dbo].StripCharacters([RegistrationNumber], '^A-Z0-9'),
    [MaxLoad] FLOAT NULL

    CONSTRAINT [FK_Hauler_Trailer] FOREIGN KEY ([ID_Hauler]) REFERENCES [Hauler]([ID]),
    CONSTRAINT [UC_RegistrationNumber] UNIQUE ([RegistrationNumberSimplified])
);

【讨论】:

  • 不幸的是,这没有帮助。即使我将返回类型更改为 CHAR(10),错误也不会消失。
【解决方案2】:

多么奇怪的问题!将该函数的源代码复制到我的数据库项目中新创建的scalar function文件中,然后删除原始文件并重命名新创建的文件后,它终于可以工作了。因为我根本没有更改任何代码,我猜这是 Visual Studio 的一些非常奇怪的错误。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2018-06-24
    • 1970-01-01
    相关资源
    最近更新 更多