2017-01-10 30 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查詢不是此作業的工具。不僅僅是這不是最好的工具 - 我想不出一個辦法。如果有人可以,我會有興趣看到它。你可能想看看寫一個表值用戶定義的函數(它接受一個字符串並返回你想要的子字符串表);你可以在查詢中使用*。*。或者只是查詢'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 

- 若要更改前綴exec ReplaceValuesInAllColumns'OlDPREFIX_','NEWPREFIX',null,'MyDB','MyTable'

- 要更改NULL exec ReplaceValuesInAllC olumns NULL, '未定義',NULL, 'MYDB', 'MyTable的'

- 若要過濾柱EXEC ReplaceValuesInAllColumns 'ID6600', '6600', 'PHONE', 'MYDB', 'MyTable的'

+0

感謝您的幫助,但它不起作用!換句話說。我在文本文件中有3個單詞,例如KB123456,KB112233,KB445566。所以我需要通過以任何以KB *開頭的單詞搜索來找到這些單詞,而在數據庫的新列中搜索結果 –

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