sot*_*otn 8 sql t-sql sql-server
我有一个持久的计算列,它调用一个Scalar Valued Function.如您所知,此函数需要具有确定性才能保持该值.即使REPLACE函数以确定的方式运行(我不能认为它不是这样的情况),SQL Server似乎将其解释为不确定的.因此,我不能在功能中使用它.
我尝试做的是将一些非英语字符转换为英语.区分大小写在这里很重要.我想的字母转换??üÜ????öÖçÇ来gGuUsSiIoOcC分别.我可以通过使用以下内容来实现它(以"非确定性"的方式)
SET @ColumnValue = REPLACE(@ColumnValue COLLATE SQL_Latin1_General_CP1253_CS_AS, '?', 'i') --This character("?") is converted to "?" after collation so that I manually replace it
SET @ColumnValue = @ColumnValue COLLATE SQL_Latin1_General_CP1253_CS_AS --This line takes care of the other characters
Run Code Online (Sandbox Code Playgroud)
SQL Server将上面的代码解释为非确定性(demo)因为REPLACE和COLLATE(我认为它虽然是确定性的......).
我尝试的另一件事是在循环中使用带有STUFF的CHARINDEX,但由于需要区分大小写,因此需要使用排序规则.如果没有排序规则,SQL Server会将其视为确定性的.WHILE
我有什么选择?
你的专栏真的是varchar类型,不是nvarchar吗?
看起来似乎COLLATE SQL_Latin1_General_CP1253_CS_AS是确定性的nvarchar,但是非确定性的varchar.
以下功能是确定性的.请注意,您需要为字符串文字添加前缀,N以使其正常工作.
CREATE FUNCTION dbo.TestFunc1 (@ColumnValue NVARCHAR(4000))
RETURNS NVARCHAR(4000)
WITH SCHEMABINDING
AS
BEGIN
SET @ColumnValue = REPLACE(@ColumnValue COLLATE SQL_Latin1_General_CP1253_CS_AS, N'?', N'i') --This character("?") is converted to "?" after collation so that I manually replace it
SET @ColumnValue = @ColumnValue COLLATE SQL_Latin1_General_CP1253_CS_AS --This line takes care of the other characters
RETURN @ColumnValue
END
Run Code Online (Sandbox Code Playgroud)
如果您需要使用varchar,那么我将使用二进制排序规则来替换特定字符.以下功能也是确定性的.
CREATE FUNCTION dbo.TestFunc2 (@ColumnValue VARCHAR(8000))
RETURNS VARCHAR(8000)
WITH SCHEMABINDING
AS
BEGIN
SET @ColumnValue = REPLACE(@ColumnValue COLLATE Latin1_General_BIN2, N'?', N'i')
SET @ColumnValue = REPLACE(@ColumnValue COLLATE Latin1_General_BIN2, N'ö', N'o')
...
RETURN @ColumnValue
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1054 次 |
| 最近记录: |