2012-02-15 5 views
1

を複数列の比較|名前|姓電話| nameWeb | surnameWeb | | phoneWeb ...T-SQL - 私は行</p> <hr> <p>1に持っている例 について表 に、同じ行から複数​​の列を比較する必要が同じ行に


と私は 何かこの


名前のように[...ウェブ]のWebから列をDBからのデータとデータを比較する必要がありますnameWeb


surname | surnameWeb


phone | phoneWeb ...


、私は一時テーブルと複数の挿入でこれをやったが、私は列

私のコード

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 

の多くはありがとうござい持っているので、私は最適化されたsolusitionを必要とします マリアン

+0

すべての列を比較する理由は何ですか? –

+0

既存のコードを含めてください。 – MatBailie

答えて

1

[OK]を、私はかなり詳細な例をコンパイルしようとしました。

「ウェブ」で終わるDO特定のテーブルのすべての列を検索する
  • を「ウェブ」で終わらない特定のテーブルのすべての列を検索する
    1. :これは何をするか、によって動的なクエリを構築で
    2. これらの2つの結果セットを一緒に結合し、等価性を測定するためのテストを構築する
    3. "Web%"を持つすべてのテーブルで必要な一致を実行して実行する動的クエリを作成する。

    明らかに、この解決策はあなたにとって100%機能しませんが、必要な解決策に導く可能性があります。だから、任意の前置きなしに、私はCODE提供:

    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

    テーブルは必要ないと思いますが、代わりにUNIONを使用できます。また、サンプルに表示されていないクエリの分析を行う必要があります。FROM dbo.contatto c ...Hereでこれを行う方法が説明されています。 #webContも必要ないかもしれませんが、それは本当に依存しています。 Indexed Viewsを使用することを検討する必要がありますが、操作が遅くなりますがルックアップテーブルに使用できます。