空格分隔字符串以创建动态Sql查询

时间:2014-06-11 12:16:05

标签: sql-server-2008

我有一个以空格分隔的字符串作为我的SP的参数。我需要拆分字符串并将每个字符串与数据库中的列与通配符进行比较并返回结果。

例如:

我有CompanyName'ABC DataServices Pvt Ltd'我需要将字符串拆分为'space',并将每个单词与数据库字段公司名称进行比较,并使用OR条件。

这样的事情:

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

有人可以帮助我实现这个目标吗?

提前致谢

4 个答案:

答案 0 :(得分: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

在商店过程中声明一个字符串,并使用set this value。使用你想要的地方。 唯一的问题是字符串已经包含句点。有一点需要注意,PARSENAME只需要四个部分,因此使用超过四个部分的字符串会导致它返回NULL

答案 1 :(得分: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','')

答案 2 :(得分:0)

您也可以试试这个。

首先在参数的值中用逗号(,)替换空格,然后用这样的where where条件替换逗号 -

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)

答案 3 :(得分: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+'%'