2015-01-15 6 views
0

Ниже хранимая процедураПроблема с некоторыми символами в расщеплении строк

;WITH cte AS (
SELECT 
    AgentId, 
    CAST('<r>' + REPLACE(States, ',', '</r><r>') + '</r>' AS XML) AS States, 
    CAST('<r>' + REPLACE(REPLACE(Products,'&','&amp;'), ',', '</r><r>') + '</r>' AS XML) AS Products 
FROM @tbVendor 
) 
    ,FinalList AS (
SELECT 
AgentId, 
RTRIM(LTRIM (sTable.sColumn.value('.', 'VARCHAR(MAX)'))) AS States, 
RTRIM(LTRIM (PTable.PColumn.value('.', 'VARCHAR(MAX)'))) AS Products 
FROM cte 
CROSS APPLY States.nodes('//r') AS sTable(sColumn) 
CROSS APPLY Products.nodes('//r') AS PTable(PColumn) 
) 
SELECT DISTINCT F.Products AS ProductName 
    ,T.ProductId AS ProductId  
FROM FinalList F 
CROSS APPLY (SELECT ProductId FROM @tbProduct TP WHERE TP.ProductName = F.Products) AS   T 
WHERE F.States = 'New York' 
AND F.AgentId = 1 
ORDER BY T.ProductId ASC 

Это SQL скрипку

http://rextester.com/SVXKFH57654

Он работает отлично и прекрасно, но устранить записи с " - «символ в ProductName feild Для, например, для нетканых принадлежностей ... и т. д.

Я не могу решить эту проблему ... Пожалуйста, помогите мне !!!

+0

Ни одна из записей в вашей Fiddle не имеет в них символа «-». –

+0

Ваш Fiddle не имеет продуктов, содержащих «-», поэтому я отредактировал его, изменив «AC», чтобы быть AC », в 3-х местах и ​​побежал. –

+0

Попробуйте добавить« - »в эту скрипту, но в acult server не работает, как это ... –

ответ

0

Для строки разделения вы используете XML. В этом случае у вас будут проблемы с некоторыми символами. Например, &, <,>. Вы можете избежать этого, используя другой метод Разбиение строки

Таблица функция расщепления строки:

CREATE FUNCTION [dbo].[SplitStr] (
    @str varchar(MAX) 
    ,@sep char(1)=',' 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split (n1, n2) 
    AS 
    ( 
    SELECT CAST(0 as bigint) as n1, CHARINDEX(@sep, @str + @sep) as n2 
    UNION ALL 
    SELECT n2 as n1, CHARINDEX(@sep, @str + @sep, n2 + 1) as n2 
    FROM Split 
    WHERE n2 < LEN(@str) 
    ) 

    SELECT SUBSTRING(@str, n1+1, n2-n1-1) as Col FROM Split 
) 
GO 

Используя эту функцию:

SELECT 
    tbVendor.AgentId 
    ,States.Col as States 
    ,Products.Col as Products 
FROM @tbVendor as tbVendor 
    CROSS APPLY [dbo].[SplitStr](States, ',') as States 
    CROSS APPLY [dbo].[SplitStr](Products, ',') as Products 

это эквивалентно код

-- First convert all comma separated data into tabular form as: 
;WITH cte AS (
    SELECT 
     AgentId, 
     CAST('<r>' + REPLACE(States, ',', '</r><r>') + '</r>' AS XML) AS States, 
     CAST('<r>' + REPLACE(Products, ',', '</r><r>') + '</r>' AS XML) AS Products 
    FROM @tbVendor 
) 
SELECT 
    AgentId, 
    sTable.sColumn.value('.', 'VARCHAR(MAX)') AS States, 
    PTable.PColumn.value('.', 'VARCHAR(MAX)') AS Products 
FROM cte 
CROSS APPLY States.nodes('//r') AS sTable(sColumn) 
CROSS APPLY Products.nodes('//r') AS PTable(PColumn)