- Создать функцию 'fn_split_string', которая разбивает строку
create function dbo.fn_split_string(@str nvarchar(1000),@sep nvarchar(1))
returns @tab_split table (id int identity(1,1),str nvarchar(1000) )
as
begin
declare @str1 as nvarchar(1000)
declare @istr as nvarchar(1000)
declare @i as integer
set @str1=@str
set @i=2
while @i>0
begin
set @i=charindex(@sep,@str1,1)
if @i>0
begin
set @istr=substring(@str1,1,@i-1)
insert into @tab_split(str) values(@istr)
set @str1=substring(@str1,@i+1,len(@str1))
end
end
insert into @tab_split(str) values(@str1)
return
end
- Вы можете запустить функцию следующим образом
select * from dbo.fn_split_string ('mission to mars',' ')
- Следующий скрипт
Select * from Table` WHERE Title IN ('mission', 'to', 'mars') OR Details IN ('mission, 'to', 'mars')
- становится
select * from Table t1 inner join dbo.fn_split_string ('mission to mars',' ') t2
on t1.title=t2.str or t1.details=t2.str
- надеюсь, это поможет
- **
Другое решение, которое позволяет избежать использования циклов, так как"Zohar Peled" посоветовал
**
создать таблицу tab_numbers (Number int);
with cte as (select 1 n union all select 1+n from cte where n+1 <=100)
insert into tab_numbers select * from cte
option(maxrecursion 0)
go
create FUNCTION fn_split_string_2
(
@str NVARCHAR(MAX),
@sep NVARCHAR(255)
)
RETURNS @tab_split table (str nvarchar(max))
AS
begin
if @sep=' '
begin
set @sep=','
set @str=replace(@str,' ',',')
end
insert into @tab_split
SELECT Item = SUBSTRING(@str, Number,
CHARINDEX(@sep, @str + @sep, Number) - Number)
FROM tab_numbers
WHERE Number <= CONVERT(INT, LEN(@str))
AND SUBSTRING(@sep + @str, Number, LEN(@sep)) = @sep
;
return
end
GO