2017-01-10 7 views
0

テキストファイルから単語を見つけて、すべて後者を取得するためにあなたの助けが必要です。SQLクエリーをテキスト形式で検索する

私はコードが正常に動作していますが、値を見つけるときだけでなく、すべてのテキストを検索し続ける必要があります。私のクエリは

SELECT [test].Contents, [test].Subject, Mid(Contents,InStr(1,Contents,"KB"),9) AS KBs 
FROM [test] 

を下回っている

ので、値は、今、私は、テキストだけでなく、最初の結果では、すべての値を取得する必要がありKB5212512 が好きなはずです。おかげ

+0

'instr'機能がoracle'、ない' SQL Server'、plzはmodfiy番目 'に既存された結果を適切なタグだけを追加するタグ –

+0

SQLクエリはこのジョブのツールではありません。それが最良のツールではないだけでなく、私はそれを行う方法を考えることができません。誰かが私がそれを見るのに興味があることができるならば。テーブル値のユーザ定義関数(文字列を取り、必要な部分文字列のテーブルを返す)を書くことができます。あなたは* that *をクエリで使うことができます。または、単に 'Contents'値を照会してクライアント側で処理します。 –

+0

@AmrElsayed生データがどのように構造化されているかを知っていれば、これに対するクエリを生成する方が簡単です。 –

答えて

0

私は右のあなたの質問を理解していれば、これは動作するはずです:

SELECT [test].Contents, [test].Subject, 
Mid(Contents,InStr(1,Contents,"KB"),Len (Contents)-InStr(1,Contents,"KB")+1) AS KBs 
FROM [test] 
+0

ご協力ありがとうございますが、動作していません! つまり、私はテキストファイルの中に3ワード、例えばKB123456、KB112233、KB445566を持っています。だから私はKBで始まる単語で検索することでこれらの単語を見つける必要がありますが、結果はDBの新しい列になります –

0

このソリューションは、正しいKBコードを抽出する機能を使用しています。

create Procedure ReplaceValuesInAllColumns (@OldStr as nvarchar(100), @NewStr as nvarchar(100), @WHERE as nvarchar(max), @db as SYSNAME, @tName as SYSNAME) 
as 
begin 
declare @rSQL as nvarchar(max) 
set @rSQL =' 
declare @cName as nvarchar(100) 
declare @sql as nvarchar(max) 
declare cCursor cursor for select c.name 
     from [' + @db + '].sys.columns c 
     inner join [' + @db + '].sys.objects o on c.object_id = o.object_id 
     left join [' + @db + '].sys.identity_columns ic on c.object_id = ic.object_id AND c.column_id = ic.column_id 
     where c.is_computed = 0 
     and o.name = ''' + @tname + ''' 
     and ic.object_id is null and o.type=''u'' 
open cCursor 
FETCH NEXT FROM cCursor INTO @cName 
WHILE @@FETCH_STATUS = 0 
    begin 
    ' + 
    iif (@OldStr is not null, ' set @sql = ''Update [' + @db + ']..[' + @tName + '] SET ['' + @cname + ''] = REPLACE(['' + @cname + ''],''''' + @OldStr + ''''',''''' + @NewStr + ''''')' 
    ,' set @sql = ''Update [' + @db + ']..[' + @tName + '] SET ['' + @cname + ''] = ''''' + @NewStr + '''''' 
    ) + 
    iif (@WHERE is not null, ' WHERE ['' + @cname + ''] LIKE ''''%' + @WHERE + '%''''' 
    ,'') + ''' 

    exec(@sql) 
    FETCH NEXT FROM cCursor INTO @cName 
    end 
close cCursor 
deallocate cCursor' 
exec(@rSQL) 
end 

は、プレフィックスを変更--to EXEC ReplaceValuesInAllColumns 'OlDPREFIX_'、 'NEWPREFIX'、null、 'MyDB'、 'MyTable'

- NULLを変更するにはReplaceValuesInAllC olumns NULL、NULL、 'UNDEFINED' 'mydbという'、 'たMyTable'

列のEXEC ReplaceValuesInAllColumns 'ID6600'、 '6600'、 '電話'、 'MyDBと'、 'たMyTable'

をフィルタリング--to
+0

助けてくれてありがとうございます!言い換えれば、私はテキストファイルの中に3ワード、例えばKB123456、KB112233、KB445566を持っています。だから私はKBで始まる単語で検索することでこれらの単語を見つける必要がありますが、結果はDBの新しい列になります –

0

これは、文字列の下に動作するように再帰CTEを使用します。

DECLARE @string NVARCHAR(MAX)= 
N'PATCHES/WORKAROUNDS: o December, 2016 Security and Quality Rollup for Microsoft .NET Framework 4.5.2 on Windows Server 2012 for x64 (KB3205403) Microsoft .NET Framework 4.5.2 on Windows Server 2012 for x64 (KB3205254) Microsoft .NET Framework 4.5.2 on Windows Server 2012 for x64 (KB3205418)'; 

DECLARE @KBPattern NVARCHAR(MAX)=N'%(KB[0-9][0-9][0-9][0-9][0-9]%)%'; 

WITH recCTE AS 
(
    SELECT LEFT(@string,PATINDEX(@KBPattern,@string)+10) AS Part 
      ,SUBSTRING(@string,PATINDEX(@KBPattern,@string)+12,4000) AS Rest 
    UNION ALL 
    SELECT LEFT(recCTE.Rest,PATINDEX(@KBPattern,recCTE.Rest)+10) AS Part 
      ,SUBSTRING(recCTE.Rest,PATINDEX(@KBPattern,recCTE.Rest)+12,4000) AS Rest 
    FROM recCTE 
    WHERE PATINDEX(@KBPattern,recCTE.Rest)>0 
) 
SELECT SUBSTRING(Part,posKB,15) AS KB_Number 
     ,LEFT(Part,posKB-1) AS KB_Text 
FROM recCTE 
OUTER APPLY(SELECT PATINDEX(@KBPattern,Part)) AS A(posKB) 

KB_Number KB_Text 
(KB3205403) PATCHES/WORKAROUNDS: o December, 2016 Security and Quality Rollup for Microsoft .NET Framework 4.5.2 on Windows Server 2012 for x64 
(KB3205254) Microsoft .NET Framework 4.5.2 on Windows Server 2012 for x64 
(KB3205418) Microsoft .NET Framework 4.5.2 on Windows Server 2012 for x64 
関連する問題