繁体   English   中英

特殊类型的ntext列中的SQL SubString

[英]SQL SubString from Special Kind of ntext column

我有一个数据库表,其中ntext类型的列填充了类似的值

A <1,?,'attrdisplay'= A <1,?,'1361147_2'='2','1361147_3'='3','1361147_4'='4','1361147_5'='5','1361147_6 '='6','1361147_7'='1'>,'ClassificationInheritance'= A <1,?,'DisabledIds'= A <1,?>>,'机密'= 0,'CreationNotification'= A <1 ,?,'mail'='Ärendehar skapats','收件人'= A <1,?,1414822 = -1,1414823 = -1,1414824 = -1,1414825 = -1,1414826 = -1,1414827 = -1,1415811 = -1 >>,'IsSubBinder'= 1,'name'= A <1,?,'fullname'='Ärendemall5','mlNames'= A <1,?,'sv'='Ärendemall5 '>,'name'='Ärendemall5','nameFormat'=':name:','ok'= true,'refnr'='SJCM-2013-00014'>,'showDocumentsFirst'= true,'WorkItem'= A <1,?,'id'=-1,'Name'=''>>

对于表中的每个此类行,我只需要提取此值SJCM-2013-00014

知道我该怎么做吗?

先感谢您!

我猜您真正想要的是搜索并提取refnr吗? 如果您有可能向服务器添加CLR函数,以便能够使用正则表达式,那么这是迄今为止最简单的方法:

CREATE TABLE #test (data ntext)
INSERT INTO #test VALUES('A<1,?,''attrdisplay''=A<1,?,''1361147_2''=''2'',''1361147_3''=''3'',''1361147_4''=''4'',''1361147_5''=''5'',''1361147_6''=''6'',''1361147_7''=''1''>,''ClassificationInheritance''=A<1,?,''DisabledIds''=A<1,?>>,''Confidential''=0,''CreationNotification''=A<1,?,''mail''=''Ärende har skapats'',''recipients''=A<1,?,1414822=-1,1414823=-1,1414824=-1,1414825=-1,1414826=-1,1414827=-1,1415811=-1>>,''IsSubBinder''=1,''name''=A<1,?,''fullname''=''Ärendemall5'',''mlNames''=A<1,?,''sv''=''Ärendemall5''>,''name''=''Ärendemall5'',''nameFormat''='':name:'',''ok''=true,''refnr''=''SJCM-2013-00014''>,''showDocumentsFirst''=true,''WorkItem''=A<1,?,''id''=-1,''Name''=''''>>')

SELECT
    *,
    [dbo].[RegexMatchGroupClr](
        CAST(data as nvarchar(max)), 
        'refnr''=''(?<refnr>[^'']+)''', 
        'refnr'
    )
FROM
    #test 

这是在C#函数中使用正则表达式完成的,在C#中如下所示:

[SqlFunction]
public static SqlChars RegexMatchGroupClr(SqlChars input, string pattern, string groupName)
{
    if (input.IsNull) return input;

    string inputString = new string(input.Value);
    rx.Match match = rx.Regex.Match(inputString, pattern);

    if (match.Success && match.Groups[groupName].Success)
    {
        string resultString = match.Groups[groupName].Value;
        SqlChars result = new SqlChars(resultString.ToCharArray());
        return result;
    }

    return null;
}

如果您没有添加CLR功能的可能性,那么它仍然可行,但是更加麻烦:

CREATE TABLE #test (data ntext)
INSERT INTO #test VALUES('A<1,?,''attrdisplay''=A<1,?,''1361147_2''=''2'',''1361147_3''=''3'',''1361147_4''=''4'',''1361147_5''=''5'',''1361147_6''=''6'',''1361147_7''=''1''>,''ClassificationInheritance''=A<1,?,''DisabledIds''=A<1,?>>,''Confidential''=0,''CreationNotification''=A<1,?,''mail''=''Ärende har skapats'',''recipients''=A<1,?,1414822=-1,1414823=-1,1414824=-1,1414825=-1,1414826=-1,1414827=-1,1415811=-1>>,''IsSubBinder''=1,''name''=A<1,?,''fullname''=''Ärendemall5'',''mlNames''=A<1,?,''sv''=''Ärendemall5''>,''name''=''Ärendemall5'',''nameFormat''='':name:'',''ok''=true,''refnr''=''SJCM-2013-00014''>,''showDocumentsFirst''=true,''WorkItem''=A<1,?,''id''=-1,''Name''=''''>>')
DECLARE @SearchFor varchar(10) = 'refnr''=''';
DECLARE @EndsWith varchar(10) = '''';

WITH converted AS (
    SELECT
        CAST(data as nvarchar(max)) as data
    FROM
        #test
), startPos AS (
    SELECT
        *
        ,CHARINDEX(@SearchFor, data) + LEN(@SearchFor) as startPos
    FROM
        converted
), endPos AS (
    SELECT
        *
        ,CHARINDEX(@EndsWith, data, startPos) as endPos
    FROM
        startPos
)
SELECT
    *
    ,SUBSTRING(data, startPos, endPos - startPos) as refnr
FROM
    endPos

而且,如果您不能使用通用表表达式,它将变得更加难以理解:

CREATE TABLE #test (data ntext)
INSERT INTO #test VALUES('A<1,?,''attrdisplay''=A<1,?,''1361147_2''=''2'',''1361147_3''=''3'',''1361147_4''=''4'',''1361147_5''=''5'',''1361147_6''=''6'',''1361147_7''=''1''>,''ClassificationInheritance''=A<1,?,''DisabledIds''=A<1,?>>,''Confidential''=0,''CreationNotification''=A<1,?,''mail''=''Ärende har skapats'',''recipients''=A<1,?,1414822=-1,1414823=-1,1414824=-1,1414825=-1,1414826=-1,1414827=-1,1415811=-1>>,''IsSubBinder''=1,''name''=A<1,?,''fullname''=''Ärendemall5'',''mlNames''=A<1,?,''sv''=''Ärendemall5''>,''name''=''Ärendemall5'',''nameFormat''='':name:'',''ok''=true,''refnr''=''SJCM-2013-00014''>,''showDocumentsFirst''=true,''WorkItem''=A<1,?,''id''=-1,''Name''=''''>>')
DECLARE @SearchFor varchar(10) = 'refnr''=''';
DECLARE @EndsWith varchar(10) = '''';

SELECT
    *
    ,SUBSTRING(data, (CHARINDEX(@SearchFor, data) + LEN(@SearchFor)), (CHARINDEX(@EndsWith, data, (CHARINDEX(@SearchFor, data) + LEN(@SearchFor)))) - (CHARINDEX(@SearchFor, data) + LEN(@SearchFor))) as refnr
FROM
    #test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM