2013-10-12 46 views
1

我正在處理一個小項目,但遇到了一個小障礙。分割文本SQL文本

所以我目前能夠發送/接收短信,並將其存儲到數據庫中。 現在我正在研究一個觸發器,但我很困難。

文本到達表收件箱和我需要的信息是在列:textdecoded。該文本始終是一樣的東西:

1站5 (INT作爲ID,開始/停止,INT)

現在的問題是,

我怎麼定義拆分該記錄的功能和地方action.id的ID,開始/在action.action最後INT到action.time停止(注:action.time被定義爲int而不是作爲一個時間))事先大家

感謝: ) 親切的問候, 大衛

+0

哦,什麼是_database inbox_? – geomagas

+0

到目前爲止我沒有任何東西,可能已經太長時間了,但我真的希望在星期一之前完成。數據庫收件箱應該已經是表格收件箱:) –

+0

感謝您澄清。請看我的答案。 – geomagas

回答

1

如果您使用SQL Server你可以做這樣的事情:

CREATE FUNCTION PARSE_STRING(@text NVARCHAR(MAX)) 
AS 
    BEGIN 

    INSERT INTO --yourTable-- 
    SELECT 
     SUBSTRING(@text, 0, PATINDEX('%st%', @text)), 
     SUBSTRING(@text, PATINDEX('%st%', @text), CHARINDEX(' ', SUBSTRING(@text, PATINDEX('%st%', @text), LEN(@text)))), 
     SUBSTRING(@text, CHARINDEX(' ', SUBSTRING(@text, PATINDEX('%st%', @text), LEN(@text))) + LEN(@text) - LEN(SUBSTRING(@text, PATINDEX('%st%', @text), LEN(@text))), LEN(@text)) 

    END 

而且,這裏是一個工作SQLFiddle

然後創建功能之後,你可以把它在你的觸發,或其他任何地方你想。

+0

哦,還有1秒鐘,我必須調整一下:-)。我也會發佈一個鏈接到一個工作小提琴。來自收件箱的' –

1
select case when column_name like '%stop%' then 
substring('column_name ' ,1,charindex('stop','column_name ',1)-1) 
      ,'stop' 
     ,substring('column_name ' ,charindex('stop','column_name ',1)+5,1 
     ) 
     case when column_name like '%start%' then 
substring('column_name ' ,1,charindex('start','column_name ',1)-1) 
      ,'start' 
     ,substring('column_name ' ,charindex('start','column_name ',1)+6,1 
     )  
from table_name 
1
DECLARE @Inbox as varchar(15) 
SET @Inbox = '1 start 5' 
SELECT SUBSTRING(@Inbox,1,PATINDEX('% %',@Inbox)) AS ID, 
     SUBSTRING(@Inbox,PATINDEX('% %',@Inbox),PATINDEX('% %',RIGHT(@Inbox,LEN(@Inbox)-PATINDEX('% %',@Inbox)))) AS Action, 
     RIGHT(@Inbox,PATINDEX('% %',REVERSE(@Inbox))) AS ActionTime 
1

試試這個觸發:

create trigger inbox_cascade 
on inbox 
for insert 
as 
    begin 
    declare @txt varchar(max) 
    declare @cmd nvarchar(max) 
    declare c cursor for select replace(textdecoded,' ',''',''') from inserted 
    open c 
    fetch next from c into @txt 
    while @@fetch_status=0 
    begin 
    set @cmd='insert into action (id,action,time) values('''[email protected]+''')' 
    exec sp_executesql @cmd 
    fetch next from c into @txt 
    end 
    close c 
    deallocate c 
end 
+1

'應該來自'插入',否則如果收件箱包含多於1條記錄,語句就會中斷。加上你的觸發器不處理插入多條記錄。 – devio

+0

對!!!我在想什麼? 1M thanx! – geomagas

+0

解決了這兩個問題。再次感謝! – geomagas

0

好了,所以我就經過一番激烈的思想以下,並採取一休:

declare @failureId int 
    declare @action varchar(200) 
    declare @time int 
    declare @input varchar(200) 
    declare @input2 varchar(200) 
    declare @alertId int 

    select @input = (select textdecoded from inserted) 
    select @failureId = substring(@input, 1, charindex(' ',@input)-1) 

    select @input2 = substring(@input, charindex(' ',@input)+1, LEN(@input) - charindex(' ', @input)+1) 
    select @action = substring(@input2, 1, charindex(' ', @input2)-1) 

    select @time = substring(@input2, charindex(' ',@input2)+1, LEN(@input) - charindex(' ', @input)+1) 

    select @alertId = (select id from Alert where failureId = @failureId) 

    insert into Action values (@alertId, @failureId, @action, @time) 

我知道這是不是一個完美的一段代碼,但它對我有用:) 感謝大家對這件事的幫助:)你的sug堵塞和想法給了我所需要的推動:d

非常非常感謝:d