2012-02-15 4 views
1

мне нужно сравнить несколько столбцов из тех же строк в таблице Например я имею на рядеT-SQL - Сравнение нескольких столбцов в одной строке


1 | имя | фамилия | телефон | имяWeb | surnameWeb | phoneWeb ...


и мне нужно сравнить данные из БД и данных из Web [....] Web столбцы что-то вроде этого имени


| nameWeb


фамилия | surnameWeb


телефон | phoneWeb ...


Я сделал это с временными таблицами и несколькими вкладышами, но мне нужно оптимизированную solusition потому что у меня много столбцов

мой код

SELECT  
-- Contatto 
       c.id , 
-- Ditta 
       d.nome 'nomeDitta' , 
       d.filiale , 
       d.webNome webNomeDitta , 
       d.webDescrizione webDescrizione , 
-- Persona 
       p.nome Nome , 
       p.cognome Cognome , 
       p.email , 
       p.telefono , 
       p.fax , 
       p.webNome , 
       p.webCognome , 
       p.webEmail , 
       p.webTelefono , 
       p.webFax , 
       p.webNoteAggiuntive , 
       p.canali , 
-- Indirizzo 
       i.indirizzo1 , 
       i.indirizzo2 , 
       i.cap , 
       i.localita , 
       i.webIndirizzo1 , 
       i.webIndirizzo2 , 
       i.webCap , 
       i.webLocalita , 
       i.webNome 'NomeInd' , 
-- Nazione 
       n.stato 'Nazione' , 
       n2.stato 'webNazione' , 
-- Lingua 
       L.nome 'webLingua' 
     INTO #webCont 
     FROM dbo.contatto c ... 
     WHERE c.id = @idContatto 

     DECLARE @result TABLE (ColumnName NVARCHAR(100) , 
           DB   NVARCHAR(100) , 
           Web   NVARCHAR(100) , 
           hasData  BIT) 

     INSERT INTO @result SELECT 'Nome Ditta' , nomeDitta , webNomeDitta , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Nome' , Nome , webNome , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Cognome' , Cognome , webCognome , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'eMail' , email , webEmail , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Telefono' , telefono , webTelefono , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Fax' , fax , webFax , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Indirizzo 1' , indirizzo1 , webIndirizzo1 , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Indirizzo 2' , indirizzo2 , webIndirizzo2 , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Cap' , cap , webCap , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Localita' , localita , webLocalita , @hasData FROM #webCont 
     INSERT INTO @result SELECT 'Nazione' , Nazione , webNazione , @hasData FROM #webCont 

Спасибо, Marian

+0

В чем причина сравнения всех столбцов? –

+0

Пожалуйста, включите ваш существующий код. – MatBailie

ответ

1

Хорошо, я попытался составить для вас довольно подробный пример. Что это будет сделать, это создать динамический запрос по:

  1. Нахождение всех столбцов в специфичном таблице НЕ оканчивающиеся на «Web»
  2. Нахождение всех столбцов в конкретной таблице, кончаются в «Сети»
  3. Объедините эти два набора результатов и постройте тест для измерения равенства.
  4. Используйте комбинированный результирующий набор для построения динамического запроса, который будет выполняться и выполнять необходимые совпадения во всех таблицах, которые могут иметь ссылку «% Web» ,

Очевидно, что это решение не будет работать на вас 100%, но может помочь вам в решении, которое вам нужно. Так, без дальнейшей суматохи я представляю код:

DECLARE 
    @SQL nvarchar(max) 
    , @TableName nvarchar(max) 

SET @TableName = 'Test' 

SET @SQL = 'SELECT ' 
;WITH NonWeb AS 
(
SELECT 
    [COLUMN_NAME] as [NonWebColumn] 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE 
    [TABLE_NAME] = @TableName 
AND [COLUMN_NAME] NOT LIKE '%Web' 
), 
Web AS 
(
SELECT 
    '[' + C.[COLUMN_NAME] + ']' as [WebColumn] 
    , '[' + NonWeb.[NonWebColumn] + ']' as [NonWebColumn] 
    , 'CASE WHEN [' + C.[COLUMN_NAME] + '] = [' + NonWeb.[NonWebColumn] + '] THEN ''Equal'' ELSE ''Not Equal'' END as [' + NonWeb.[NonWebColumn] + 'Match]' as [Match] 
FROM INFORMATION_SCHEMA.COLUMNS C 
    INNER JOIN NonWeb ON 
     REPLACE(C.[COLUMN_NAME],'Web','') = NonWeb.[NonWebColumn] 
WHERE 
    [TABLE_NAME] = @TableName 
AND [COLUMN_NAME] LIKE '%Web' 
) 

SELECT @SQL = 'SELECT ' + STUFF 
(
    (
     SELECT 
      ', ' + [NonWebColumn] + ', ' + [WebColumn] + ', ' + [Match] 
     FROM Web 
     FOR XML PATH('') 
    ) 
    , 1 
    , 2 
    , '' 
) + ' FROM ' + @TableName 

EXEC sp_ExecuteSql @SQL 

Вы можете просто изменить значение переменной @TableName (который получает набор в начале) к тому, что название вашей конкретной таблицы есть и проверить его , Предположение здесь, конечно, состоит в том, что в этой таблице есть столбцы, заканчивающиеся на «Web» ...

+0

спасибо за ответ, чтобы быть справедливым, вы отвечаете на требование по названию, но у меня есть несколько таблиц и разных имен в столбцах, я увижу, могу ли я использовать временные файлы и попробую вас ответить – Zyku

+0

Еще лучше - просто сделайте картографирование ваших таблиц/столбцов в представление и запустить этот скрипт в представлении ... :) – FarligOpptreden

1

Я думаю, вам не нужно @result таблица, вы можете использовать вместо этого UNION. Также вы должны сделать анализ вашего запроса, который мы не видим в вашем примере. FROM dbo.contatto c ...Here описал, как это сделать. Возможно, вам тоже не нужно #webCont, но это действительно зависит. Возможно, вам стоит подумать об использовании Indexed Views, они замедляют операции, но могут использоваться для таблиц поиска.

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