2016-05-09 1 views
0

У меня есть код ниже. Я использовал что-то очень похожее на это раньше, чтобы разрешить ввод нескольких значений в строку с разделителями-запятыми.TSQL несколько значений в where с использованием узлов XML

По какой-то причине запрос только принимает самое первое значение и не продолжает считывать значения. @Tables будет что-то вроде "Table1, table2, table3" Может ли кто-нибудь увидеть мою ошибку? Он работает с числами, если я делаю '1, 2, 3, 4' в базе данных, которая работает, но она не работает со строками.

DECLARE @TableXML AS XML 
SET @TableXML = cast(('<a>'+replace(@Tables,',' ,'</a><a>') 
      +'</a>') AS XML); 

SELECT 
* 
FROM CABDetail 
WHERE CABDetail.BudgetName in (SELECT 
    a.value('.', 'varchar(max)') 
    FROM @TableXML.nodes('a') AS FN(a) 
) 

ORDER BY CABDetail.account 
+1

Должно работать, если 'CABDetail.BudgetName' содержит одно из значений Table1, table2, table3. Можете ли вы создать образец таблицы с данными, которые можно использовать для воспроизведения проблемы? – har07

ответ

2

Вы могли TRIM результат: Table1, table2, table3:

SELECT * 
FROM CABDetail 
WHERE CABDetail.BudgetName in (SELECT LTRIM(RTRIM(a.value('.', 'varchar(max)'))) 
           FROM @TableXML.nodes('a') AS FN(a) 
) 
ORDER BY CABDetail.account; 

LiveDemo

Причина очень проста, когда вы разбираете вы получите:

'Table1' 
' table2' 
' table3' 

и при сравнении 'table2' не соответствует ' table2'.

Он работает с числами, потому что вы можете неявно CAST' 2' целыми числами.

SELECT CAST(' 2' AS INT); 
-- 2 

Другая возможность замены ', ' вместо ',':

DECLARE @TableXML AS XML 
SET @TableXML = cast(('<a>'+replace(@Tables,', ' ,'</a><a>') 
     +'</a>') AS XML); 

От SQL Server 2016+ вы можете использовать встроенные функции: STRING_SPLIT

SELECT * 
FROM #CABDetail 
WHERE BudgetName in (SELECT RTRIM(LTRIM([value])) 
        FROM STRING_SPLIT(@Tables, ',')); 

LiveDemo2

0

Ваш SQL скрипт, кажется, успешно работает на моем SQL2014 дБ

declare @Tables as nvarchar(max) = 'Table1, table2, table3' 

DECLARE @TableXML AS XML 
SET @TableXML = cast(('<a>'+replace(@Tables,',' ,'</a><a>')+'</a>') AS XML); 

SELECT 
a.value('.', 'varchar(max)') 
FROM @TableXML.nodes('a') AS FN(a) 

Там, кажется, ничего не будет проблемой Но вы можете думать об использовании SQL split string function и использовать его в заявление Выберите в качестве следует искать в качестве альтернативы, если вы не можете определить проблему в вашем случае.

declare @Tables as nvarchar(max) = 'Table1, table2, table3' 
SELECT val FROM dbo.Split(@Tables, ',') a