SQL SERVER中游标的使用实例+详解(涉及SQL中字符串拼接)

下面这个实例主要针对如下需求,
例如 有“山东省 济南市 济南市历下区” 这三级,
要改成“山东省济南市 山东省济南市历下区” 需要把全国各个地市前面都加上省份。
这是用到的相关数据表:
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' 

猜你喜欢

转载自blog.csdn.net/zhuyin6553/article/details/97917510