使用WITH结果执行两个语句

时间:2017-08-22 11:02:25

标签: sql-server tsql common-table-expression

我需要根据WITH数据集的结果执行两个不同的语句。但是文件说,一个WITH只能跟着一条指令。

是否有一种简单的方法可以使用WITH?返回的数据集执行两个语句。我想的是在开头...结束部分或括号中包括我的两个陈述...... ......

这是我的代码,我想执行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 个答案:

答案 0 :(得分: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 :(得分:1)

合并声明非常适合这种情况。我试图实现类似的逻辑,它可能是错误的,因为没有样本数据和架构细节,可视化场景有点困难。您可以参考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)