基于这个问题,我创建了一个函数并将其添加到我的数据库中。现在我想将该函数用作计算列:
-- 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的一些非常奇怪的错误。