2014-06-11 59 views
2

我有一个空格分隔的字符串作为参数给我的SP。我需要拆分字符串,并将每个字符串与通配符中的列进行比较并返回结果。空格分隔字符串创建动态Sql查询

例如:

我有公司名称“ABC DataService的私人有限公司”我需要拆分的“空间”的字符串,并与数据库中的字段公司名称的每个字比较有OR条件。

事情是这样的:

select * 
from CompanyTable 
where companyname like '%ABC%' 
    or companyname like '%DataServices%' 
    or companyname like '%Pvt%' 
    or companyname like '%Ltd%' 

有人能帮助我实现这一目标?

在此先感谢

回答

0

尝试this SQL用户定义的函数来解析分隔字符串很有帮助。

对于快速解决方案利用这一点,

SELECT PARSENAME(REPLACE('ABC DataServices Pvt Ltd', ' ', '.'), 2) // return DataServices 

PARSENAME将一个字符串分割它的时代特色。它接受一个数字作为第二个参数,该数字指定要返回的字符串的哪一部分(从后到前工作)。 你可以把你想要的指数代替2,在上述像

SELECT PARSENAME(REPLACE('ABC DataServices Pvt Ltd', ' ', '.'), 3) --return Pvt 

你的店过程中声明的字符串,并使用此值设置它。使用你想要的地方。 唯一的问题是当字符串已经包含句点。有一点需要指出的是,PARSENAME只希望四个部分,因此使用字符串有超过四个部分组成,该函数返回NULL

0

试试这个功能:

CREATE FUNCTION [dbo].[fnSplitString] 
( 
@string NVARCHAR(MAX), 
@delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
DECLARE @start INT, @end INT 
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
WHILE @start < LEN(@string) + 1 BEGIN 
    IF @end = 0 
     SET @end = LEN(@string) + 1 

    INSERT INTO @output (splitdata) 
    VALUES(SUBSTRING(@string, @start, @end - @start)) 
    SET @start = @end + 1 
    SET @end = CHARINDEX(@delimiter, @string, @start) 

END 
RETURN 
END 

而且使用这样的:

select * from dbo.fnSplitString('Querying SQL Server','') 
0

你也可以试试这个。

首先在参数的值用逗号(,)替换空间,然后与期望的地方像这样的情况替换逗号 -

DECLARE @companyname VARCHAR(1000) 
    ,@where VARCHAR(max) 

SET @companyname = 'ABC DataServices Pvt Ltd' 
SET @companyname = replace(@companyname, ' ', ', ') 

SELECT @where = 'companyname like ''%' + 
REPLACE(@companyname, ', ', '%'' OR companyname like ''%') + '%''' 

PRINT @where 

PRINT ('SELECT * FROM CompanyTable WHERE' + @where) 
--EXEC ('SELECT * FROM CompanyTable WHERE' + @where) 
0

这将扩展到任意数量的搜索词,也不需要动态SQL。

declare @a table (w varchar(50)) -- holds original string 
declare @b table (s varchar(50)) -- holds parsed string 

insert into @a -- load string into temp table 
values ('ABC DataServices Pvt Ltd') 

--parse string as XML 
;WITH Vals AS (
     SELECT w, 
       CAST('<d>' + REPLACE(w, ' ', '</d><d>') + '</d>' AS XML) XmlColumn 
     FROM @a 
) 


--Insert results to parsed string 
insert into @b 
SELECT 
     C.value('.','varchar(max)') ColumnValue 
FROM Vals 
CROSS APPLY Vals.XmlColumn.nodes('/d') AS T(C) 


--Join on results 
select * from companytable 
join @b b on b.s like '%'+companyname+'%' 
+0

XML解析器无耻地从这里窃取http://stackoverflow.com/a/4267183/2587452。如果您需要更多的性能,可以使用临时表来分割结果并对其进行索引。 –