2012-05-16 2 views
-2

Использования Linq для SQLLinq к SQL запрашивая Колонок с пробелами в колонке данных

Как один запрос и матч, чтобы включить все строки из таблицы с вторичной столбцом, который содержит пробела в колонке?

Таблица 1:

ID FAQ MODELS 
1 faq1 model1 
2 faq2 model2 model1 
3 faq3 model3 model2 model1 (Spaces in models column) 

Таблица 2:

ID MODELS PIC 
1 model1 model1pic 
2 model2 model2pic 
3 model3 modal3pic 

Ожидая:

faq1 model1 model1pic 
faq2 model1 model1pic 
faq2 model2 model2pic 
faq3 model1 model1pic 
faq3 model2 model2pic 
faq3 model3 model3pic 


SELECT kwfaqtmp.faqmodelnum, kwFAQtmp.issue, 
kwfaqtmp.resolution, kwtable4tmp.modelnum,  
kwtable4tmp.prodpic 
FROM kwfaqtmp AS t1 CROSS APPLY dbo.SplitStrings(t1.faqmodelnum, ' ') AS s 
INNER JOIN dbo.kwtable4tmp 
AS t2 ON s.item COLLATE SQL_Latin1_General_CP1_CI_AS = t2.modelnum 
COLLATE SQL_Latin1_General_CP1_CI_AS 
ORDER BY t1.issue; 
+0

Вы говорите о расщеплении данных столбцов? – akatakritos

+0

Правильно! Я только что редактировал вопрос. – InCode

ответ

2

Если вы не можете исправить дизайн (вы не должны хранить несколько штук данных в одном столбце, как указано в другом месте), вы можете выполнить это с помощью функции разделения:

CREATE FUNCTION dbo.SplitStrings 
(
    @List NVARCHAR(MAX), 
    @Delim NCHAR(1) 
) 
RETURNS TABLE 
AS 
    RETURN (SELECT DISTINCT Item FROM 
     (SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)') 
     FROM (SELECT [XML] = CONVERT(XML, '<i>' 
     + REPLACE(@List, @Delim, '</i><i>') + '</i>').query('.') 
      ) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y 
     WHERE Item IS NOT NULL 
    ); 
GO 

Теперь вы можете сказать:

SELECT t1.FAQ, t2.MODELS, t2.PIC 
FROM dbo.Table1 AS t1 
CROSS APPLY dbo.SplitStrings(t1.MODELS, ' ') AS s 
INNER JOIN dbo.Table2 AS t2 
ON  s.Item COLLATE SQL_Latin1_General_CP1_CI_AS 
    = t2.Models COLLATE SQL_Latin1_General_CP1_CI_AS 
ORDER BY t1.FAQ; 

Результаты:

FAQ MODELS PIC 
---- ------ --------- 
faq1 model1 model1pic 
faq2 model1 model1pic 
faq2 model2 model2pic 
faq3 model1 model1pic 
faq3 model2 model2pic 
faq3 model3 modal3pic 

Запрос вы пытались использовать:

SELECT kwfaqtmp.faqmodelnum, kwFAQtmp.issue,kwfaqtmp.resolution, 
    kwtable4tmp.modelnum, kwtable4tmp.prodpic 
FROM kwfaqtmp AS t1 
CROSS APPLY dbo.SplitStrings(t1.faqmodelnum, ' ') AS s 
INNER JOIN dbo.kwtable4tmp AS t2 
    ON s.item COLLATE SQL_Latin1_General_CP1_CI_AS 
    = t2.modelnum COLLATE SQL_Latin1_General_CP1_CI_AS 
ORDER BY t1.issue; 

Это просто не действует. Хотя это не должно приводить к точной ошибке, которую вы цитируете в комментарии. Как насчет сохранения псевдонимов t1/t2, как показал мой первоначальный запрос?

SELECT t1.faqmodelnum, t1.issue, t1.resolution, 
    t2.modelnum, t2.prodpic 
FROM kwfaqtmp AS t1 
CROSS APPLY dbo.SplitStrings(t1.faqmodelnum, ' ') AS s 
INNER JOIN dbo.kwtable4tmp AS t2 
    ON s.item COLLATE SQL_Latin1_General_CP1_CI_AS 
    = t2.modelnum COLLATE SQL_Latin1_General_CP1_CI_AS 
ORDER BY t1.issue; 
+0

Не автоматический. LINQ squeels и жалуется, что не может преобразовать в соответствующую команду sql – InCode

+0

Если вы используете конструктор Linq2SQL (откройте файл .dbml), вы можете указать свойство Source в окне свойств. Мне кажется, что-то вроде dbo. [Foo bar]. – akatakritos

+0

Нет. Я имею в виду данные в столбце. – InCode

0

Вы должны использовать ColumnAttribute в вашем классе сопоставления. Создайте класс POCO с именами полей без пробелов, сопоставленных с пробелами в таблице.

0

Я думаю, вам нужно реорганизовать вашу базу данных.

FAQ (remove MODELS column) 

ID FAQ 
1 faq1 
2 faq2 
3 faq3 

FAQMODELS (Create this table) 
ID FAQ MODELS 
1 faq1 model1 
2 faq2 model2 
3 faq2 model1 
4 faq3 model3 
5 faq3 model2 
6 faq3 model1 

MODELSPIC  
ID MODELS PIC 
1 model1 model1pic 
2 model2 model2pic 
3 model3 modal3pic 

Тогда вы можете

SELECT 
    FAQ, 
    MODELS, 
    PIC 
FROM FAQMODELS INNER JOIN MODELSPIC ON FAQMODELS.MODELS = MODELSPIC.MODELS 
+0

Я собираюсь взять ваши рекомендации для будущих проектов. – InCode

+0

Кстати, у кого есть подходящий скрипт для автоматизации этого? – InCode

Смежные вопросы