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

时间:2017-06-19 14:15:07

标签: sql-server tsql replace

我仍然在学习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字符。从查看REPLACE的SQL Server文档,我不认为它(REPLACE)接受表的列,也不接受游标。是因为我们在函数上下文中使用REPLACE吗?如果有人能指出我解释它的好资源,我会非常感激。

提前谢谢!

5 个答案:

答案 0 :(得分:3)

这是一个名为Quirky Update

的hacky技巧

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

一些例子:

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有效!

这个 Quirky Update 是我知道的唯一一种方法,可以使用表的值来逐步替换您可以在表中动态维护的许多值:

看看这个:

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!

答案 1 :(得分:2)

通常,是的,您可以使用SQL Server语法中任何位置的列中的值来预期值(而不是预期 name 的位置,例如DATEPART)的第一个参数。

然而,这是破坏的代码 - 似乎假设将按顺序评估每一行,并且将使用从先前行生成的值来评估每一行。但是,SQL Server仅向perform one assignment保证(对于" last"行 - 但是,没有ORDER BY子句," last"是不明确的):

  

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

看起来是否可行保证实际上不会发生多项任务。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

实际上它可以使用表格列并对表格中的每一行进行替换。但它只能起作用,因为@InputString变量每次都会受到影响。

也许您可以使用local temporary table来存储您的NonNumeric

请注意,因为在@InputString是VARCHAR时返回NVARCHAR值。

答案 4 :(得分:1)

一个简单的代码,向您显示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采用随机值并检查变量string pattern中的@InputString,从而传递@Test变量确保REPLACE正确的字符串模式< / p>