下面这个实例主要针对如下需求,
例如 有“山东省 济南市 济南市历下区” 这三级,
要改成“山东省济南市 山东省济南市历下区” 需要把全国各个地市前面都加上省份。
这是用到的相关数据表:
https://pan.baidu.com/s/1KsRITT88EABGOEufthA6zA
不知道如何导出表结构和表数据的同学请看:
https://blog.csdn.net/zhuyin6553/article/details/97915657
数据大致如下:
--我想到了用游标来提取数据,通过存储过程接收传进来的省份名称和省份编号
--但是这有个不好的地方,就是需要手动传数据,如果有100组数据要传的话那相当的麻烦
--组里老哥说可以用SQL语句直接解决,让我自己想一想
--先把自己写的代码贴出来
--直接用SQL的以后再补
USE [cwbaseERP]
GO
/****** Object: StoredProcedure [LCERP9999].[ERP_AM_CZCX] Script Date: 2019/7/31 13:37:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER procedure [LCERP9999].[UpdateCity]
(
@Province varchar(36),--省份名称
@procinceNum varchar(36)--省份编号
)
as
begin
DECLARE @city nvarchar(36) -- 声明变量
DECLARE My_Cursor CURSOR --定义游标
--查出省份下的城市集合放到游标中
FOR (select LSCSZD_MC FROM LSCSZD_CS WHERE LSCSZD_BH LIKE @procinceNum+'____')
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @city;--//移动游标指向到第一条数据,提取第一条数据存放在变量中
WHILE @@FETCH_STATUS = 0 --如果上一次操作成功则继续循环
BEGIN
UPDATE LSCSZD_CS
SET LSCSZD_MC = @Province+@city
WHERE LSCSZD_MC = @city
FETCH NEXT FROM My_Cursor INTO @city;--继续提下一行
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
end
EXEC UpdateCity @Province = '河南省',@procinceNum='0114'
@@fetch_status是MSSQL的一个全局变量
其值有以下三种,分别表示三种不同含义:【返回类型integer】
- 0 FETCH 语句成功
-1 FETCH 语句失败或此行不在结果集中
-2 被提取的行不存在
--sql语句更改数据
update lscszd a
set lscszd_mc =
(select (select lscszd_mc
from lscszd c
where
c.lscszd_jc = '2'
and c.lscszd_fjnm =substring(b.lscszd_fjnm,0,4)
)||lscszd_mc
from lscszd b
where
b.lscszd_nm =a.lscszd_nm
)
where a.lscszd_jc='3'