SQL Server 中的 REPLACE 函数是否接受来自表中的"string_pattern"参数输入?



我还在学习SQL Server,也许这个问题听起来很幼稚/荒谬。请耐心等待。:)

我在SQL Server中看到了一个函数,定义如下:

CREATE FUNCTION [dbo].[fn_CleanNumeric]
    (
    @InputString VARCHAR(500)
    )
RETURNS NVARCHAR(500)
as
BEGIN
    SELECT
        @InputString = REPLACE(@InputString, n.Symbol, '')
    FROM 
        NonNumeric n
    RETURN @InputString
END

NonNumeric 是一个表,其中包含一个名为 [Symbol] 的列,其中包含一堆非数字 ASCII 字符。从查看SQL Server文档来看REPLACE,我认为它(REPLACE(不接受表的列,也似乎不接受游标。是因为我们在函数上下文中使用REPLACE吗?如果有人能指出我一个很好的资源来解释它,我将不胜感激。

提前谢谢你!

这是一个叫做古怪更新的黑客技巧

这很慢,在大多数情况下应该避免

一些例子:

DECLARE @tbl TABLE(SomeInt INT);
INSERT INTO @tbl VALUES (1),(2),(3);
DECLARE @SumOfInts INT=0
SELECT @SumOfInts = @SumOfInts + SomeInt FROM @tbl;
SELECT @SumOfInts; --SELECT SUM(SomeInt) FROM @tbl is clearly better...)

字符串串联

DECLARE @tbl2 TABLE(SomeText VARCHAR(100));
INSERT INTO @tbl2 VALUES ('a'),('b'),('c');
DECLARE @ConcatString VARCHAR(100)='';
SELECT @ConcatString = @ConcatString + ', ' + SomeText FROM @tbl2;
SELECT @ConcatString;

更好的是FOR XML PATH('')STUFF()的通常方法,这也是一种笨拙的解决方法。(较新的版本最终将带来内置功能!

有了REPLACE它就可以工作了!

这个古怪的更新是我知道使用表的值逐步替换可以在表中动态维护的许多值的唯一方法:

看看这个:

DECLARE @ReplaceValues TABLE(this VARCHAR(100),[by] VARCHAR(100));
INSERT INTO @ReplaceValues VALUES('$',' Dollar'),('€',' Euro'),('abbr.','abbreviations');
DECLARE @SomeText VARCHAR(MAX)=
'This text is about 100 $ or 100 € and shows how to replace abbr.!';
SELECT @SomeText=REPLACE(@SomeText,this,[by]) FROM @ReplaceValues;
SELECT @SomeText;

结果

--This text is about 100  Dollar or 100  Euro and shows how to replace abbreviations!

通常,是的,您可以将列中的值用于 SQL Server 语法中需要值的任何位置(而不是需要名称的位置,例如要DATEPART的第一个参数(。

但是,这是损坏的代码 - 它似乎假设每一行都将按顺序计算,并且每一行将使用从前几行生成的值进行评估。但是,SQL Server 只保证执行一个赋值(对于"最后一行",但是,没有ORDER BY子句,"last"定义不明确(:

如果 SELECT 语句返回多个值,则会为变量分配返回的最后一个值。

无论它是否看起来有效,并不能保证实际会发生不止一项任务。

替换 接受表列,在这种情况下,它将完全按照您的期望执行。它将对变量进行迭代@InputString并排除出现在非数字表和@InputString变量中的所有非数字字符。

实际上,

它将与表列一起使用,并对表中的每一行进行替换。但它之所以有效,是因为 @InputString 变量每次都会受到影响。

也许您可以使用本地临时表来存储您的非数字

请注意,因为您返回的是 NVARCHAR 值,而@InputString是 VARCHAR。

一个简单的代码,用于显示REPLACE可以接受来自table的值

CREATE TABLE dbo.Test
(
RowID INT IDENTITY(1,1),
Test VARCHAR(20)
)
GO
INSERT INTO dbo.Test VALUES ('James')
INSERT INTO dbo.Test VALUES ('John')
GO
ALTER FUNCTION [dbo].[fn_CleanNumeric]
    (
    @InputString VARCHAR(500),
    @Test VARCHAR(500)
    )
RETURNS TABLE
AS
RETURN(
 SELECT
        REPLACE(@InputString, n.Test, '') AS Test
    FROM 
        dbo.Test n WHERE Test = @Test)
GO
SELECT * FROM [dbo].[fn_CleanNumeric] ('TestJohn','John')

结果

Test
--------
TestT

SELECT取一个随机值,并将在变量@InputString中检查该string pattern,因此传递一个@Test变量可确保REPLACE正确的字符串模式

相关内容

最新更新