1

SQL Server 2008 では、以下のコード プロジェクト サイトから正規表現の一致と置換関数を作成しましたが、うまく機能しています。 http://www.codeproject.com/KB/string/SqlRegEx.aspx?msg=3683405#xx3683405xx . この関数は、基本的に列のテキストを検索し、一致を見つけて、置き換えられたテキストに置き換えます。ここでは後方参照を使用しました。

たとえば、Column1 に「最初の記事 #345 が 9999 によって参照され、001 に配置されている」場合、345#9999#001 が返されます。

select ステートメント Select column1, dbo.ufn_RegExReplace(Column1, '(?\d+). ?(?\d+). ?(?\d+).*?(?\d+)', '${First_number_match}#${ Second_number_match}#Third_number_match',1) は正常に動作しています。

私が欲しいのは、テーブルの 3 つの列に 345#9999#001 を挿入することです。

私の実際の問題では、正規表現を使用する必要があることに注意してください。専門家が問題に集中できるように簡略化しました。

私たちが知っているように、正規表現は神経をすり減らすものであり、SQL で使用するとそれに追加されます。だから私はこれに関する助けに感謝します。これを読んでくれてありがとう。

4

1 に答える 1

1

文字列分割関数を作成し、それを使用して個々の値を取得できます。たとえば、次のようなものです。

CREATE FUNCTION dbo.fn_StringSplit(@String NVARCHAR(8000), @Delimiter NCHAR(1))       
RETURNS @tblItems TABLE (item NVARCHAR(8000))       
AS       
BEGIN       
    DECLARE @idx INT       
    DECLARE @slice NVARCHAR(8000)       

    SELECT @idx = 1       
        IF LEN(@String) < 1 OR @String IS NULL  RETURN       

    WHILE (@idx != 0 AND LEN(@string) > 0)
    BEGIN
        SET @idx = CHARINDEX(@Delimiter, @String)       
        IF @idx != 0       
            SET @slice = LEFT(@String, @idx - 1)       
        ELSE       
            SET @slice = @String       

        IF(LEN(@slice) > 0)  
            INSERT INTO @tblItems(item) VALUES (@slice)       

        -- Trim saved item from remaining string 
        SET @String = RIGHT(@String, LEN(@String) - @idx)             
    END
RETURN       
END 

または、上記の Split 関数を変更して、必要に応じて 1 つのテーブル行で 3 つの値を返すか、ストアド プロシージャの 3 つの出力パラメーターとして返すことができます。

于 2011-02-03T18:52:43.753 に答える