wuxing@name
  • Archives
  • Baby
  • CODING
  • About
wuxing@name
  • Archives
  • Baby
  • CODING
  • About
Category:

程序开发

C++ go Ruby on Rails python 全都不会~

数据库

编写SQL Server 2005 PIVOT查询

by Andy 十一月 14, 2008

PIVOT是新引入SQL Server 2005的运算符,它让你能够将行级数据旋转成为列表数据,而不需要像先前版本的SQL Server一样使用CASE语句。

CASE语句查询

对于数据库开发人员来说,将行级数据转换为列级数据并不是什么新东西。在SQL Server以前的版本里,要获得所需要的跨表格数据集就要用到一系列CASE语句和聚合查询。虽然这种方式让开发人员具有了对所返回数据进行高度控制的能力,但是编写出这些查询是一件很麻烦的事情。

为了看一下这些CASE语句是如何使用的。我们需要一些测试数据。运行列表A里的脚本能够创建一个SalesHistory表格并把数据加载到表格里。

现在我可以编写一个基于CASE语句的PIVOT查询。这个查询的目标是按照年份将每件产品的销售状况集中起来,这些产品包括:BigScreen、PoolTable和Computer。每件产品自己的销售数据都放在专用的列里。列表B里是CASE语句查询的脚本。

这个查询虽然很简单,相对容易编写,但是很繁复。你必须明确地为每个想要转换成列表数据的行输入一个CASE语句,这一点意思都没有。如果有个程序能够帮你自动完成这项任务就好了——这就是PIVOT运算符的作用之所在。

PIVOT

由于SQL Server 2005有了新的PIVOT运算符,就不再需要CASE语句和GROUP BY语句了。(每个PIVOT查询都涉及某种类型的聚合,因此你可以忽略GROUP BY语句。)PIVOT运算符让我们能够利用CASE语句查询实现相同的功能,但是你可以用更少的代码就实现,而且看起来更漂亮。列表C是一个示例PIVOT查询,它模仿的是我们的CASE语句查询。

这个查询的关键部分是PIVOT运算符后面的括号。在括号里面,我们使用一个SUM聚合函数计算用FOR Product IN()语句列出的每个Product的SalePrice总和。这个语句可能看起来有点别扭,因为IN()语句的值没有放在(’)符号里,它们是文本值。这些值事实上被当作ColumnNames对待,它们在最终的结果集里被转换成列表字段。

如果你运行这个查询,得到的结果与我们从CASE语句查询获得的结果类似。但两者的一个重要不同之处是,这个查询仍然会为我们表格里列出的每个行返回一个行,这当然是不能令人满意的;我们希望获得一个直观的表格列表,列出每年的销售量。造成这种情况的问题在于我们一开始编写PIVOT查询的方式。

在这个查询的SELECT语句中,我们只是在SalesHistory列表里简单地列出了年,并为每个产品设定了一个字段。因此问题在于处理PIVOT语句的SELECT语句无法确定在PIVOT语句里要使用哪一个列。PIVOT语句将分组应用到了所有的列,后者既不是旋转字段也不是聚合字段。我们可以使用子查询来实现满意的结果。列表D是编写好的查询。这一小小的改动让我们能够用更少代码模拟CASE语句查询。

不足之处

PIVOT运算符在很多情况下都很有用,然而它还有一些不足之处。PIVOT运算符所提供的很多功能都要求你对旋转成为列级数据的字段进行“硬编码”。你可以利用动态TSQL语句编写PIVOT查询来解决这一问题,但是这还不是最理想的解决办法。

使用PIVOT语句的另外一个潜在问题是你或许只能在结果集里聚合一个字段;而你利用CASE语句查询可以聚合任意多的字段。

虽然这些潜在不足之处似乎可能成为阻碍使用新PIVOT运算符的障碍,但是它在TSQL开发人员的工具箱里还是占有一席之地。

十一月 14, 2008 0 comment
0 FacebookTwitterPinterestEmail
程序开发

VSS(visual source safe)找回密码

by Andy 十一月 5, 2008

一不小心将VSS 6 admin用户的密码忘记(再此证明我的粗心),Baidu了一番,找到以下信息

the secret is to hack the um.dat file to remove the Admin password

from offset 80 the bytes are (all numbers are hex)

0:80  55 55 bc 7f 41 64 6d 69 6e 00 00 00 00 00 00 00
0:90  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0:a0  00 00 00 00 90 6e 00 00 a8 01 00 00 00 00 00 00

Just load the um.dat file into a hex editor and change the bytes from =
offset 80 to exactly what is shown above. When the SourceSafe admin tool =
starts it believes that the admin password has never been set.

the hex values above are taken from a ‘virgin’ um.dat file

of course, you didn’t get this from me….and ALWAYS backup first (just =
in case I’m wrong)
有朋友看不懂,我用中文解释一下

如果忘记了密码,打开你vss数据库所在的文件夹,打开data目录,
找到um.dat文件,用hex编辑器打开编辑它,从offset 80的55 55 开始
将值改为如上文所述的样子,然后保存,这样um.dat文件就回到了
初始状态,然后打开vss admin,用admin用户登录,不需要密码了。

thanks googlepages.com:  下载:  UM.DAT  我放了一个修改过的文件.

十一月 5, 2008 2 comments
0 FacebookTwitterPinterestEmail
数据库

SQL Server日期格式的转换

by Andy 九月 6, 2008

SQL Server中文版的默认的日期字段datetime格式是yyyy-mm-dd Thh:mm:ss.mmm

例如:

select getdate()

2004-09-12 11:06:08.177

这对于在要不同数据库间转移数据或者习惯oracle日期格式YYYY-MM-DD HH24:MI:SS的人多少有些不方便.

SQL Server里面可能经常会用到的日期格式转换方法:

举例如下:

select CONVERT(varchar, getdate(), 120 )
2004-09-12 11:06:08

select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),’-‘,”),’ ‘,”),’:’,”)
20040912110608

select CONVERT(varchar(12) , getdate(), 111 )
2004/09/12

select CONVERT(varchar(12) , getdate(), 112 )
20040912

select CONVERT(varchar(12) , getdate(), 102 )
2004.09.12

不常用的日期格式转换方法:

select CONVERT(varchar(12) , getdate(), 101 )
09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )
12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )
12.09.2004

select CONVERT(varchar(12) , getdate(), 105 )
12-09-2004

select CONVERT(varchar(12) , getdate(), 106 )
12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )
09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )
11:06:08

select CONVERT(varchar(12) , getdate(), 109 )
09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )
09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )
12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )
11:06:08.177

九月 6, 2008 0 comment
0 FacebookTwitterPinterestEmail
数据库

用sql语句生成SQLserver(MSSQL)数据字典

by Andy 八月 31, 2008
--显示表结构sql语句SQL Server 2000----------------------1

SELECT
表名=case when a.colorder=1 then d.name else '' end,
表说明=case when a.colorder=1 then isnull(f.value,'') else '' end,
字段序号=a.colorder,
字段名=a.name,
标识=case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end,
主键=case when exists(SELECT 1 FROM sysobjects where xtype='PK' and name in (
SELECT name FROM sysindexes WHERE indid in(
SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid
))) then '√' else '' end,
类型=b.name,
占用字节数=a.length,
长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),
小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),
允许空=case when a.isnullable=1 then '√'else '' end,
默认值=isnull(e.text,''),
字段说明=isnull(g.[value],'')
FROM syscolumns a
left join systypes b on a.xusertype=b.xusertype
inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e on a.cdefault=e.id
left join sysproperties g on a.id=g.id and a.colid=g.smallid
left join sysproperties f on d.id=f.id and f.smallid=0
--where d.name='要查询的表' --如果只查询指定表,加上此条件
order by a.id,a.colorder

--SQL Server 2000----------------------2         

SELECT
          (case when a.colorder=1 then d.name else '' end)表名,
          a.colorder 字段序号,
          a.name 字段名,
          (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end)
标识,
          (case when (SELECT count(*)
          FROM sysobjects
          WHERE (name in
                    (SELECT name
                   FROM sysindexes
                   WHERE (id = a.id) AND (indid in
                             (SELECT indid
                            FROM sysindexkeys
                            WHERE (id = a.id) AND (colid in
                                      (SELECT colid
                                     FROM syscolumns
                                     WHERE (id = a.id) AND (name = a.name))))))) AND
                 (xtype = 'PK'))>0 then '√' else '' end) 主键,
          b.name 类型,
          a.length 占用字节数,
          COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,
          isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,
          (case when a.isnullable=1 then '√'else '' end) 允许空,
          isnull(e.text,'') 默认值,
          isnull(g.[value],'') AS 字段说明
FROM     syscolumns     a left join systypes b
on     a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id     and     d.xtype='U' and     .name<>'dtproperties'
left join syscomments e
on a.cdefault=e.id
left join sysproperties g
on a.id=g.id AND a.colid = g.smallid
order by a.id,a.colorder

SQL Server 2005--------------------------------------------------------------------------------

SELECT
         (case when a.colorder=1 then d.name else '' end)表名,
         a.colorder 字段序号,
         a.name 字段名,
         (case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) 标识,
         (case when (SELECT count(*)
         FROM sysobjects
         WHERE (name in
                   (SELECT name
                  FROM sysindexes
                  WHERE (id = a.id) AND (indid in
                            (SELECT indid
                             FROM sysindexkeys
                           WHERE (id = a.id) AND (colid in
                                     (SELECT colid
                                    FROM syscolumns
                                    WHERE (id = a.id) AND (name = a.name))))))) AND
                (xtype = 'PK'))>0 then '√' else '' end) 主键,
         b.name 类型,
         a.length 占用字节数,
         COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,
         isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,
         (case when a.isnullable=1 then '√'else '' end) 允许空,
         isnull(e.text,'') 默认值,
         isnull(g.[value],'') AS 字段说明
FROM    syscolumns    a left join systypes b
on    a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id    and    d.xtype='U' and    d.name<>'dtproperties'
left join syscomments e
on a.cdefault=e.id
left join sys.extended_properties g --2005相应的修改
on a.id=g.major_id AND a.colid = g.major_id --2005相应的修改
where d.name='D3'
order by a.id,a.colorder
八月 31, 2008 0 comment
0 FacebookTwitterPinterestEmail
  • 1
  • …
  • 3
  • 4
  • 5

About Me

About Me

Writer & Reader

Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed.

Recent Posts

  • DeepL机器翻译的力量

    七月 7, 2020
  • net Core Rest Api 调用

    七月 7, 2020
  • Oracle EM 安装 修复

    五月 15, 2020
  • wpf c# login and Upgrade

    十二月 6, 2019
  • Open SSL 证书生成 对exe 签名

    十一月 7, 2019
  • Facebook
  • Twitter
  • Instagram
  • Pinterest
  • Tumblr
  • Youtube
  • Bloglovin
  • Snapchat

@2019 - All Right Reserved. Designed and Developed by PenciDesign


Back To Top