2017-08-22 10 views
1

WITHデータセットの結果に基づいて2つの異なるステートメントを実行する必要があります。しかし、文書では、WITHには1つの命令しか続かないことが示されています。WITH結果を使用して2つのステートメントを実行

WITHで返されたデータセットを使用して2つのステートメントを実行する簡単な方法はありますか?私は2つのステートメントをbegin ... endセクションまたは括弧内に含めるようなことを考えていました... ...

これは私のコードです。私はこの結果をUPDATEとINSERTを実行したいと思います。 WITH:

with EMPRESAS 
    as (
    select splitdata as EMPRESA from fnSplitString(@EMPRESES_CONTA_SEPARADES_PER_COMA, ',') 
    union 
    select substring(@BRANCH_1,1,1) 
), PROA_EMPRESAS 
    as (
    select case EMPRESA when 'A' then 2 when 'B' then 5 when 'C' then 4 when 'D' then 1 when 'E' then 3 end as PROA_EMPRESA 
    from EMPRESAS 
) 

    update CLIENTE_CLIENTE_TIPO set CLG_COD = dbo.cCLIENTE_GRUPO_ClienteConActividad(), CCE_COD = @TARGMAG, CCT_ORI = 2 
    from PROA_EMPRESAS 
     inner join CLIENTE_CLIENTE_TIPO on CTI_COD = dbo.cCLIENTE_TIPO_Cliente() and CLI_COD = @CLI_COD and EMP_KEY = PROA_EMPRESA 
    where isnull(CLG_COD,-1) <> dbo.cCLIENTE_GRUPO_ClienteConActividad() or isnull(CCE_COD,'') <> @TARGMAG or isnull(CCT_ORI,-1) <> 2; 

    insert into CLIENTE_CLIENTE_TIPO (CTI_COD, CLI_COD, EMP_KEY, CLG_COD, CCE_COD, CCT_ORI) 
     select dbo.cCLIENTE_TIPO_Cliente(), @CLI_COD, PROA_EMPRESA, dbo.cCLIENTE_GRUPO_ClienteConActividad(), @TARGMAG, 2 
     from PROA_EMPRESAS 
       left outer join CLIENTE_CLIENTE_TIPO EXISTE on EXISTE.CTI_COD = dbo.cCLIENTE_TIPO_Cliente() and EXISTE.CLI_COD = @CLI_COD and EXISTE.EMP_KEY = PROA_EMPRESA 
     where PROA_EMPRESA is not null and EXISTE.CLI_COD is null; 

単一の命令としての私のINSERTやUPDATEを網羅するための簡単な方法はありますか私は実際にストアドプロシージャを作成したり、すべての命令のための私のWITHを再定義する必要がありますか?。

ありがとうございます。

答えて

2

あなたは2つの可能性があります。

1)は、中間結果セットマテリアライズする一時テーブルを使用します。

with EMPRESAS 
    as (
    select splitdata as EMPRESA from fnSplitString(@EMPRESES_CONTA_SEPARADES_PER_COMA, ',') 
    union 
    select substring(@BRANCH_1,1,1) 
) 
    select case EMPRESA when 'A' then 2 when 'B' then 5 when 'C' then 4 when 'D' then 1 when 'E' then 3 end as PROA_EMPRESA 
    INTO #temp 
    from EMPRESAS; 

update CLIENTE_CLIENTE_TIPO set CLG_COD = dbo.cCLIENTE_GRUPO_ClienteConActividad(), CCE_COD = @TARGMAG, CCT_ORI = 2 
from #temp PROA_EMPRESAS 
... 

INSERT INTO ... 
select dbo.cCLIENTE_TIPO_Cliente(), @CLI_COD, PROA_EMPRESA, dbo.cCLIENTE_GRUPO_ClienteConActividad(), @TARGMAG, 2 
from #temp PROA_EMPRESAS ... 

2)WITHMERGEステートメントを使用します。

with EMPRESAS 
    as (
    select splitdata as EMPRESA from fnSplitString(@EMPRESES_CONTA_SEPARADES_PER_COMA, ',') 
    union 
    select substring(@BRANCH_1,1,1) 
), PROA_EMPRESAS 
    as (
    select case EMPRESA when 'A' then 2 when 'B' then 5 when 'C' then 4 when 'D' then 1 when 'E' then 3 end as PROA_EMPRESA 
    from EMPRESAS 
) 
    MERGE CLIENTE_CLIENTE_TIPO AS trg 
    USING AS src 
    ON src.... = trg.... 
    WHEN MATCHED AND add_condition... THEN 
    UPDATE ... 
    WHEN NOT MATCHED BY TARGET THEN 
    INSERT 
+1

は非常によく説明しました。私は現在のコードよりも簡単なので、最初の解決策を取るつもりです。しかし、ある時点で私はMERGEを使うことを学ぶ必要があります。ありがとうございました。 –

1

MERGE文は完璧ですこのシナリオでは、同様のロジックを実装しようとしましたが、サンプルデータとスキーマの詳細がなくてもシナリオを視覚化するのは少し難しいので間違いかもしれません。あなたは、次のMSDNドキュメントHEREHERE

を参照することができ、サンプルソリューションです:

;WITH EMPRESAS AS 
(
    SELECT splitdata as EMPRESA 
    FROM fnSplitString(@EMPRESES_CONTA_SEPARADES_PER_COMA, ',') 
    UNION 
    SELECT substring(@BRANCH_1,1,1) 
), 
PROA_EMPRESAS AS 
(
    SELECT CASE EMPRESA WHEN 'A' THEN 2 WHEN 'B' THEN 5 WHEN 'C' WHEN 4 when 'D' WHEN 1 when 'E' THEN 3 END AS PROA_EMPRESA 
    FROM EMPRESAS 
) 
MERGE CLIENTE_CLIENTE_TIPO AS T 
USING PROA_EMPRESAS AS S 
ON  CTI_COD = dbo.cCLIENTE_TIPO_Cliente() 
     AND CLI_COD = @CLI_COD 
     AND EMP_KEY = S.PROA_EMPRESA 
WHEN MATCHED 
THEN UPDATE 
     SET CLG_COD = dbo.cCLIENTE_GRUPO_ClienteConActividad() 
     , CCE_COD = @TARGMAG 
     , CCT_ORI = 2 
WHEN NOT MATCHED BY T 
THEN INSERT INTO CLIENTE_CLIENTE_TIPO (CTI_COD, CLI_COD, EMP_KEY, CLG_COD, CCE_COD, CCT_ORI) 
     VALUES(@CLI_COD, S.PROA_EMPRESA, dbo.cCLIENTE_GRUPO_ClienteConActividad(), @TARGMAG, 2) 
+0

彼は2つの選択肢を提供してくれたので、私は他の解決策を承認しましたが、完全な提案を作成する時間を取ってくれてありがとう。 –

関連する問題