惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
M
MIT News - Artificial intelligence
The Cloudflare Blog
N
Netflix TechBlog - Medium
GbyAI
GbyAI
Help Net Security
Help Net Security
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
Martin Fowler
Martin Fowler
量子位
P
Palo Alto Networks Blog
Security Latest
Security Latest
Attack and Defense Labs
Attack and Defense Labs
WordPress大学
WordPress大学
H
Help Net Security
C
Check Point Blog
T
Troy Hunt's Blog
C
CERT Recently Published Vulnerability Notes
Y
Y Combinator Blog
NISL@THU
NISL@THU
L
LINUX DO - 最新话题
V
Visual Studio Blog
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Securelist
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
The Exploit Database - CXSecurity.com
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Recent Announcements
Recent Announcements
Forbes - Security
Forbes - Security
IT之家
IT之家
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
L
LangChain Blog
AWS News Blog
AWS News Blog
N
News and Events Feed by Topic
Stack Overflow Blog
Stack Overflow Blog
H
Hacker News: Front Page
B
Blog
W
WeLiveSecurity
罗磊的独立博客
Jina AI
Jina AI
博客园 - 【当耐特】

博客园 - 水如烟(LzmTW)

.NET的变量在代码集中是不安全的 HOW TO:获取硬盘物理序列号(VB.NET) 一个创建快捷方式类 一个简单的CodeAccessPermission生成器 认识一下Attribute HOW TO:端口打印(比较粗糙) 标记法定义和创建数据库(四) 标记法定义和创建数据库 Sql2005数据类型与Framework类型的对应关系 HOW TO:重启程序(WinForm) HOW TO:设置默认打印机 HOW TO:避免“将COM对象与其基础RCW分开后不能再使用该对象”错误 HOW TO:控制是否允许用户退出ExcelApplication的Workbook 树和自联表(五) 树和自联表(六) 树和自联表(四) 树和自联表(一) 行政区划数据数据库的设计(脚本) 行政区划数据数据库的设计(六)
行政区划数据数据库的设计(七)
水如烟(LzmTW) · 2006-09-21 · via 博客园 - 水如烟(LzmTW)

Author水如烟

行政区划数据数据库的设计()

上文实现了把区划码按三个行政级别分成了六个类,分别是:

一级:省

二级:省直辖市、地区州盟

三级:市地辖区、县旗、省直辖县级市


至于这样的命名和分级对不对,我心里也没准,不过修改还是方便的,到时知错了改正就是了。

现在继续说附属部分的全名。

单单给出了区划码和名称,如:654221  额敏县,我们看着也只有干着急的份。需要更多的信息。如是654221  新疆维吾尔自治区塔城地区额敏县,这才是我们需要的,看着也乐意。

全名无非是由省++县的名称组成,也就是一级名称+二级名称+三级名称,这是约定俗成的,不知也有相关规定没有,这回我没有去找(应当已有国家标准规定)。

这个定义我可以用函数固定下来了:

[Action].全名

USE [RegionalCodeWorks]
GO
/****** 对象:  UserDefinedFunction [Action].[全名]    脚本日期: 09/21/2006 17:55:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
--
 Author:      LzmTW
--
 Create date: 20060921
--
 Description: 取行政区全名 
--=============================================

CREATE FUNCTION [Action].[全名] 
(
     
@当前时间    [Base].[RegionalDate]    = N'Current'
    ,
@一级        nchar(2)
    ,
@二级        nchar(2)
    ,
@三级        nchar(2)
)
RETURNS nvarchar(200)
AS
BEGIN
    
--初始化变量

    
DECLARE  @全名        nvarchar(200)
            ,
@一级全名    nvarchar(100)
            ,
@二级全名    nvarchar(100)
            ,
@三级全名    nvarchar(100)SET @一级全名 = N''
    
SET @二级全名 = N''
    
SET @三级全名 = N''DECLARE  @一级区划码    [Base].RegionalCode
            ,
@二级区划码    [Base].RegionalCode    
            ,
@当前区划码    [Base].RegionalCodeSET    @一级区划码 = @一级 + N'00' + N'00'
    
SET    @二级区划码 = @一级 + @二级 + N'00'
    
SET    @当前区划码 = @一级 + @二级 + @三级--分三种情形取全名

    
IF @当前区划码 = @一级区划码
        
SELECT @一级全名 = 名称
        
FROM [Action].[行政区情况](@当前时间)
        
WHERE 区划码 = @当前区划码ELSE
        
IF @当前区划码 = @二级区划码
            
BEGIN
                
SELECT @一级全名 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @一级区划码SELECT @二级全名 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @当前区划码
            
END
        
ELSE
            
BEGINSELECT @一级全名 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @一级区划码SELECT @二级全名 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @二级区划码SELECT @三级全名 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @当前区划码ENDSET @全名 =   @一级全名
                
+ @二级全名
                
+ @三级全名RETURN @全名END

现在我们可以看看结果,在ManageMent上运行:

USE [RegionalCodeWorks]
GOSELECT   *
        ,
[Action].全名(DEFAULT, 一级, 二级, 三级) AS 全名 
FROM [Action].[行政区情况] (DEFAULT)

存在如下一些结果是需要重新处理这个函数的:

2 110100 市辖区 11 01 00 Current 20020331 北京市市辖区
3 110101 东城区 11 01 01 Current 20020331 北京市市辖区东城区

19 110200 县 11 02 00 Current 20020331 北京市县
20 110228 密云县 11 02 28 Current 20020331 北京市县密云县

全名中我对二级名称作了如下处理:

凡二级名称是“市辖区”、“市”、“县”的,都不取。

USE [RegionalCodeWorks]
GO
/****** 对象:  UserDefinedFunction [Action].[全名]    脚本日期: 09/21/2006 18:38:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
--
 Author:        LzmTW
--
 Create date: 20060921
--
 Description:    取行政区的全名
--
 =============================================
CREATE FUNCTION [Action].[全名] 
(
     
@当前时间    [Base].[RegionalDate]    = N'Current'
    ,
@一级        nchar(2)
    ,
@二级        nchar(2)
    ,
@三级        nchar(2)
)
RETURNS nvarchar(200)
AS
BEGIN
    
--初始化变量

    
DECLARE     @全名        nvarchar(200)
            ,
@一级名称    nvarchar(100)
            ,
@二级名称    nvarchar(100)
            ,
@三级名称    nvarchar(100)SET @一级名称 = N''
    
SET @二级名称 = N''
    
SET @三级名称 = N''DECLARE     @一级区划码    [Base].RegionalCode
            ,
@二级区划码    [Base].RegionalCode    
            ,
@当前区划码    [Base].RegionalCodeSET    @一级区划码 = @一级 + N'00' + N'00'
    
SET    @二级区划码 = @一级 + @二级 + N'00'
    
SET    @当前区划码 = @一级 + @二级 + @三级--分三种情形取全名

    
IF @当前区划码 = @一级区划码
        
SELECT @一级名称 = 名称
        
FROM [Action].[行政区情况](@当前时间)
        
WHERE 区划码 = @当前区划码ELSE
        
IF @当前区划码 = @二级区划码
            
BEGIN
                
SELECT @一级名称 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @一级区划码SELECT @二级名称 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @当前区划码
            
END
        
ELSE
            
BEGINSELECT @一级名称 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @一级区划码SELECT @二级名称 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @二级区划码SELECT @三级名称 = 名称
                
FROM [Action].[行政区情况](@当前时间)
                
WHERE 区划码 = @当前区划码ENDIF @二级名称 IN(N'市辖区', N'', N'')
        
SET @二级名称 = N''SET @全名 =   @一级名称
                
+ @二级名称
                
+ @三级名称RETURN @全名END

我将上面的X级全名改成了X级名称,这符实际。

最后,建一个存储过程,将可能需要用到的所有信息都输送出去:

USE [RegionalCodeWorks]
GO
/****** 对象:  StoredProcedure [Program].[行政区情况]    脚本日期: 09/21/2006 18:27:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
--
 Author:          LzmTW
--
 Create date:    20060921
--
 Description:   取行政区划的所有信息
--
 =============================================
CREATE PROCEDURE [Program].[行政区情况]
     
@当前时间    [Base].[RegionalDate]    = N'Current'
AS
BEGIN
    
SET NOCOUNT ON;DECLARE @类型情况 TABLE
    (
         区划码ID    
smallint
        ,类型ID        
smallint
    )
INSERT INTO @类型情况
    
EXEC [Action].[区划码类型情况] @当前时间SELECT    TOP 100 PERCENT
             d.区划码ID
            ,d.区划码
            ,d.名称
            ,
[Action].全名(@当前时间, d.一级, d.二级, d.三级) AS 全名
            ,a.类型
            ,b.级别
            ,d.一级
            ,d.二级
            ,d.三级
            ,d.截止日期
            ,d.起始日期
            ,a.类型ID
            ,b.级别ID
    
FROM    Base.行政区类型 AS a 
    
INNER JOIN Base.行政区级别 AS b 
    
ON a.级别ID = b.级别ID 
    
INNER JOIN @类型情况 AS c 
    
ON a.类型ID = c.类型ID
    
INNER JOIN [Action].行政区情况(@当前时间AS d 
    
ON d.区划码ID = c.区划码ID 
    
ORDER BY d.一级, d.二级, d.三级
END

这个数据库我觉得内容有意义,做为练习再好不过了。
若想得到更多的信息,比如历年数据对比,比如看看那些增加了换名了,看看城市化进程情况,也比如做做交叉表,等等,以后再练习。

下一文,再回到程序,实现简单的查询。