我需要根据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?
谢谢。
答案 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)使用WITH
和MERGE
声明:
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文档HERE和HERE
以下是样本解决方案:
;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)