函数名称在 SQL 服务器中是不明确的



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

-- 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]。预告片]。[注册号简化]" enthält einen nicht aufgelösten Verweis auf ein Objekt.Entweder ist das Objekt nicht vorhanden, oder der Verweis ist mehrdeutig, da er auf die folgenden Objekte verweisen könnte: [dbo].[StripCharacter] oder [德博]。[预告片]。[dbo]::[脱衣字符]。

"要么对象不存在,要么引用不明确,因为它可能意味着[dbo]。StripCharacter] 或 [dbo]。[预告片]。[dbo]::[脱衣舞字符].">

我还尝试让服务器猜测函数的命名空间。在这种情况下,数据库将引发错误:

(57,1(: SQL72014: .Net SqlClient 数据提供程序: Meldung 195, Ebene 15, 状态 10,Zeile 11 "脱衣角色"不是公认的内置 函数名称。

这里有什么问题?

我也发现了这个问题,但答案对我没有帮助,因为我不使用数据库引用。

您遇到的问题是该函数返回的值太大而无法用作键列。最大值为 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])
);

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

相关内容

  • 没有找到相关文章

最新更新