2013-10-12 89 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