• 灵活运用 SQL SERVER FOR XML PATH


    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作。那么以一个实例为主.

    一.FOR XML PATH 简单介绍

    那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:

    接下来我们来看应用FOR XML PATH的查询结果语句如下:

    SELECT*FROM@hobbyFOR XML PATH

    结果:

    复制代码
    <row> <hobbyID>1</hobbyID> <hName>爬山</hName> </row> <row> <hobbyID>2</hobbyID> <hName>游泳</hName> </row> <row> <hobbyID>3</hobbyID> <hName>美食</hName> </row>
    复制代码

    由此可见FOR XML PATH 可以将查询结果根据行输出成XML各式!

    那么,如何改变XML行节点的名称呢?代码如下:

    SELECT*FROM@hobbyFOR XML PATH('MyHobby')

     

    结果一定也可想而知了吧?没错原来的行节点<row> 变成了我们在PATH后面括号()中,自定义的名称<MyHobby>,结果如下:

    复制代码
    <MyHobby> <hobbyID>1</hobbyID> <hName>爬山</hName> </MyHobby> <MyHobby> <hobbyID>2</hobbyID> <hName>游泳</hName> </MyHobby> <MyHobby> <hobbyID>3</hobbyID> <hName>美食</hName> </MyHobby>
    复制代码

    这个时候细心的朋友一定又会问那么列节点如何改变呢?还记的给列起别名的关键字AS吗?对了就是用它!代码如下:

    SELECT hobbyID as'MyCode',hName as'MyName'FROM@hobbyFOR XML PATH('MyHobby')

     

    那么这个时候我们列的节点名称也会编程我们自定义的名称 <MyCode>与<MyName>结果如下:

    复制代码
    <MyHobby> <MyCode>1</MyCode> <MyName>爬山</MyName> </MyHobby> <MyHobby> <MyCode>2</MyCode> <MyName>游泳</MyName> </MyHobby> <MyHobby> <MyCode>3</MyCode> <MyName>美食</MyName> </MyHobby>
    复制代码

    噢! 既然行的节点与列的节点我们都可以自定义,我们是否可以构建我们喜欢的输出方式呢?还是看代码:

    SELECT'[ '+hName+' ]'FROM@hobbyFOR XML PATH('')

    没错我们还可以通过符号+号,来对字符串类型字段的输出格式进行定义。结果如下:

    [ 爬山 ][ 游泳 ][ 美食 ]

    那么其他类型的列怎么自定义? 没关系,我们将它们转换成字符串类型就行啦!例如:

    SELECT'{'+STR(hobbyID)+'}','[ '+hName+' ]'FROM@hobbyFOR XML PATH('')

    好的 FOR XML PATH就基本介绍到这里吧,更多关于FOR XML的知识请查阅帮助文档!

    接下来我们来看一个FOR XML PATH的应用场景吧!那么开始吧。。。。。。

    二.一个应用场景与FOR XML PATH应用

    首先呢!我们在增加一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好!那么现在表结构如下:

    这时,我们的要求是查询学生表,显示所有学生的爱好的结果集,代码如下:

    复制代码
    SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT sName, (SELECT hobby+','FROM student WHERE sName=A.sName FOR XML PATH('')) AS StuList FROM student A GROUPBY sName ) B
    复制代码

    结果如下:

    分析: 好的,那么我们来分析一下,首先看这句:

    SELECT hobby+','FROM student WHERE sName=A.sName FOR XML PATH('')

    这句是通过FOR XML PATH 将某一姓名如张三的爱好,显示成格式为:“ 爱好1,爱好2,爱好3,”的格式!

    那么接着看:

    复制代码
    SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT sName, (SELECT hobby+','FROM student WHERE sName=A.sName FOR XML PATH('')) AS StuList FROM student A GROUPBY sName ) B
    复制代码

    剩下的代码首先是将表分组,在执行FOR XML PATH 格式化,这时当还没有执行最外层的SELECT时查询出的结构为:

    可以看到StuList列里面的数据都会多出一个逗号,这时随外层的语句:SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby 就是来去掉逗号,并赋予有意义的列明!

    编写新闻发布系统 显示新闻条目时间问题

    金龙 |
    2013-4-23
    | 3 次访问
    没有人喜欢此内容 没有人喜欢此内容
     

    span标签放在a标签前面,然后将span标签float:right。切记切记。

     

     

    新闻列表中为了显示时间,加了个span <LI><A href="{NS:FS_NewsURL}">{NS:FS_NewsTitle}</A><span style="float:right">{NS:FS_AddTime}</span></LI> 结果这个 span竟然跑到下面去了 经过一天时间无数次的上网查资料、修改、测试 问题还是没有解决 而且遇到了更灵异的事,给前面超链接加左 浮动,在ie下文字竟然跑到列表符号前面去了 无语 分析:ie下列表符号应该没有包含在li内 span本来不换行,加浮动后成了块 元素,顶部不能高于前一元素底部 于是我又改呀改改呀改 晕,还是没改好
    最后在一个论坛发现有人这样解决了 把右浮 动放到左边去 <LI><span style="float:right">{NS:FS_AddTime}</span><A href="{NS:FS_NewsURL}">{NS:FS_NewsTitle}</A></LI> 试了一下 竟然好了 太神奇了 我想应该是放到前面的话他的前一元素就成上面的元素了

    另一篇文章里:

    例子:<h1 style=”display:inline;”>如何解决</h1><span style=”float:right;”>span右对齐的问题</span>这样的写法经过测试在IE8和firefox阅读器里可以准确显示在同一行,而在360阅读器中”span右对齐的问题”这几个字却显示到下一行的最右边,原因和解决方式如下: 当非float的元素和float的元素在一起的时候,假如非float元素在先,那么float的元素将被排挤 也就是说,你的span是float:right,但是前面h1的内容”如何解决”还是float:none,假如要<span>前后文字盘踞同一行,

    一般有两个解决方式: 1、把<sapn style=”float:right”>span右对齐的问题</span>代码置于<h1>前 <sapn style=”float:right;”>span右对齐的问题</span>:<h1 style=”display:inline;”>如何解决</h1> 2、给前面的文本设置float属性 <h1 style=”display:inline;float:left;”>如何解决</h1><span style=”float:right;”>span右对齐的问题</span>

    金龙
    2013-4-23 修改

    Linux 标准目录结构

    金龙 |
    2013-4-22
    | 2 次访问
    没有人喜欢此内容 没有人喜欢此内容
     

     

    初学Linux,首先需要弄清Linux 标准目录结构

    /

    • root --- 启动Linux时使用的一些核心文件。如操作系统内核、引导程序Grub等。
    • home --- 存储普通用户的个人文件
      • ftp --- 用户所有服务
      • httpd
      • samba
      • user1
      • user2
    • bin --- 系统启动时需要的执行文件(二进制)
    • sbin --- 可执行程序的目录,但大多存放涉及系统管理的命令。只有root权限才能执行
    • proc --- 虚拟,存在linux内核镜像;保存所有内核参数以及系统配置信息
      • 1 --- 进程编号
    • usr --- 用户目录,存放用户级的文件
      • bin --- 几乎所有用户所用命令,另外存在与/bin,/usr/local/bin
      • sbin --- 系统管理员命令,与用户相关,例如,大部分服务器程序
      • include --- 存放C/C++头文件的目录
      • lib --- 固定的程序数据
      • local --- 本地安装软件保存位置
      • man --- 手工生成的目录
      • info --- 信息文档
      • doc --- 不同包文档信息
      • tmp
      • X11R6 --- 该目录用于保存运行X-Window所需的所有文件。该目录中还包含用于运行GUI要的配置文件和二进制文件。
      • X386 --- 功能同X11R6,X11 发行版5 的系统文件
    • boot --- 引导加载器所需文件,系统所需图片保存于此
    • lib --- 根文件系统目录下程序和核心模块的公共库
      • modules --- 可加载模块,系统崩溃后重启所需模块
    • dev --- 设备文件目录
    • etc --- 配置文件
      • skel --- home目录建立,该目录初始化
      • sysconfig --- 网络,时间,键盘等配置目录
    • var
      • file
      • lib --- 该目录下的文件在系统运行时,会改变
      • local --- 安装在/usr/local的程序数据,变化的
      • lock --- 文件使用特定外设或文件,为其上锁,其他文件暂时不能访问
      • log --- 记录日志
      • run --- 系统运行合法信息
      • spool --- 打印机、邮件、代理服务器等假脱机目录
      • tmp
      • catman --- 缓存目录
    • mnt --- 临时用于挂载文件系统的地方。一般情况下这个目录是空的,而在我们将要挂载分区时在这个目录下建立目录,再将我们将要访问的设备挂载在这个目录上,这样我们就可访问文件了。
    • tmp --- 临时文件目录,系统启动后的临时文件存放在/var/tmp
    • lost+found --- 在文件系统修复时恢复的文件

    /:根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中

    /bin:/usr/bin:执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。

    /boot:放置linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可

    /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount /dev/cdrom /mnt。

    /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前记得备份。

    注:/etc/X11存放与x windows有关的设置。

    /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,~test表示用户test的家目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据

    /lib:/usr/lib:/usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules。

    /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found

    /mnt:/media:光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。

    /opt:给主机额外安装软件所摆放的目录。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下

    /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等

    /root:系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。

    /sbin:/usr/sbin:/usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。

    /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下

    /srv:服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内

    /usr:应用程序存放目录,/usr/bin存放应用程序,/usr/share存放共享数据,/usr/lib存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local:存放软件升级包。/usr/share/doc:系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容建议单独分区,设置较大的磁盘空间

    /var:放置系统执行过程中经常变化的文件,如随时更改的日志文件/var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。建议单独分区,设置较大的磁盘空间

  • 相关阅读:
    rsyslog+loganalyzer配置
    Python字符串格式化
    awk
    haproxy配置
    CentOS7服务管理
    Nginx缓存
    父指针 子指针
    矩阵 特征向量
    指针的运算
    const 与指针 的用法
  • 原文地址:https://www.cnblogs.com/alanjl/p/3044646.html
Copyright © 2020-2023  润新知