SQL?Server的七个问题及其解决办法(共10篇)由网友“stphttp”投稿提供,下面是小编整理过的SQL?Server的七个问题及其解决办法,欢迎大家阅读分享借鉴,希望对大家有所帮助。
篇1:SQL Server的七个问题及其解决办法
SQL Server的七个问题及其解决办法
1.安装过SQL Server Enterprise试用版的计算机,可以升级到什么版本的零售SQL Server?标准版,企业版,开发版。
2.ON CASCADE 我能否在Windows NT 4.0, Terminal Server版的机器上安装SQL Server ?
不可以。SQL Server 2000在Windows NT 4.0 Terminal Server上不被支持. 但是在Windows 2000 Terminal Server的机器上是可以安装的。
3.用DB-Library API开发的'应用程序SQL Server 2000是否支持?
是的,但DB-Library 不支持SQL Server 2000拥有的新特性,比如,一个DB-Library 应用程序只能连接到SQL Server 2000的缺省实例,而不能连接到任何命名实例。而且DB-Library 不支持所有在SQL Server 7.0及以后版本所提供的新功能。
4.当我从一个运行OLAP server的Windows NT上注册一个运行在Windows 2000上的OLAP server,出现以下错误:如何解决这个问题?
Errors occurred while connecting to server2000.
Cannot connect to the registry on the server computer (server2000).
Do you still want to register this server?
解决这个问题,必须启动Windows 2000的远程注册表服务:
1. 在开始菜单上,用鼠标点击“程序”,然后“管理工具”,单击“服务”(services)。
2. 右击远程注册表服务(Remote Registry Service),从弹出菜单中单击开始(start)。
5.SQL Server 2000 运行实例的端口号是否必须在安装时指定?
不是。在安装时,有选项容许指定端口号,或由server来自动选择端口号。
6.ON CASCADE DELETE 选项可以在用户界面方式下设定吗?
是的。当在Diagram用户界面下创建表时, 单击Table and Index Properties。在对话框的Relationships 表单里, 存在以下与cascading referential integrity有关的选项:
Cascade Update Related Fields
Cascade Delete Related Records
通过边上的复选框,可以指定相应的要求。
7.我是否必须使用 multi-protocol 网库来实现数据传输的加密?
Microsoft SQL Server 2000 可以使用 Secure Sockets Layer (SSL) 来加密客户程序同 SQL Server 运行实例之间的数据通信。SSL 加密是由 Super Socket 网库( Dbnetlib.dll 和 Ssnetlib.dll )来实现的,可以应用于所有被SQL Server 2000支持的网络协议之上。
篇2:Sybase SQL Server日志问题普及
Sybase SQL Server 的每一个数据库,无论是系统数据库(master,model, sybsystemprocs, tempdb),还是用户数据库,都有自己的transaction log,每个库都有 syslogs表,Log记录用户对数据库修改的操作,所以如果不用命令清除, log会一直增长直至 占满空间。清除log可用dump transaction 命令;或者开放数据库选项trunc log on chkpt, 数据库会每隔一段间隔自动清除log。管理好数据库log是用户操作数据库必须考虑的一面。
下面就几个方面谈谈log及其管理:
一、SQL Server 如何记录及读取日志信息
我们知道,SQL Server是先记log的机制。Server Cache Memory中日志页总是先写于数据页:
Log pages 在commit ,checkpoint,space needed 时写入硬盘。
Data pages 在checkpoint,space needed 时写入硬盘。
系统在recovery 时读每个database 的syslogs 表的信息,回退未完成的事务 (transaction)(数据改变到事务前状态);完成已提交的事务(transaction)(数据改变为事 务提交后的状态)。在Log中记下checkpoint点。这样保证整个数据库系统的一致性和完整性。
二、Transaction logs 和checkpoint 进程
checkpoint 命令的功能是强制所有“脏”页(自上次写入数据库设备后被更新过的页)写 入数据库设备。自动的checkpoint 间隔是由SQL Server 根据系统活动和系统表 sysconfigures中的恢复间隔(recovery interval)值计算出的。通过指定系统恢复所需的时 间总量,恢复间隔决定了checkpoint 的频率。
如果数据库开放trunc log on chkpt选项,则SQL Server在数据库系统执行checkpoint时 自动清除log。但用户自己写入执行的checkpoint命令并不清除log,即使trunc log on chkpt 选项开放。只有在trunc log on chkpt选项开放时,SQL Server自动执行checkpoint动作,才 能自动清除log 。这个自动的checkpoint动作在SQL Server中的进程叫做checkpoint进程。当 trunc log on chkpt选项开放时,checkpoint进程每隔0秒左右清除log,而不考虑recovery interval设置时间的间隔。
三、Transaction log 的大小
没有一个十分严格的和确切的方法来确定一个数据库的log应该给多大空间。对一个新建的 数据库来说,log大小为整个数据库大小的20%左右。因为log记录对数据库的修改,如果修改 的动作频繁,则log的增长十分迅速。所以说log空间大小依赖于用户是如何使用数据库的。
例如:
◆update,insert和delete 的频率
◆每个transaction 中数据的修改量
◆SQL Server系统参数recovery interval 值
◆log是否存到介质上用于数据库恢复
还有其它因素影响log大小,我们应该根据操作估计log大小,并间隔一个周期就对log进行 备份和清除。
四、检测log 的大小
若log 在自己的设备上,dbcc checktable (syslogs) 有如下信息:
例:
***NOTICE:space used on the log segment is
12.87Mbytes,64.35%
***NOTICE:space free on the log segment is 7.13Mbytes,35.65%
根据log剩余空间比例来决定是否使用dump transaction 命令来备份和清除log。
用快速方法来判断transaction log 满的程度。
1>;use database_name
2>;go
1>;select data_pgs (8,doa mpg)
2>;from sysindexes where id=8
3>;go
Note:this query may be off by as many as 16 pages.
在syslogs 表用sp_spaceused 命令。
五、log 设备
一般来说,应该将一个数据库的data和log存放在不同的数据库设备上。这样做的好处:
◆可以单独地备份(back up)transaction log
◆防止数据库溢满
◆可以看到log空间的使用情况。[dbcc checktable (syslogs)]
◆可以镜像log设备
六、log 的清除
数据库的log是不断增长的,必须在它占满空间之前清除。前面已经讨论过,清除log可以 开放数据库选项trunc log on chkpt,使数据库系统每隔一段时间间隔自动清除log,还可以 执行命令dump transaction 来清除log.trunc log on chkpt 选项同dump transaction with truncate_only 命令一样,只是清除log而不保留log到备份设备上。所以如果只想清除log而 不做备份,可以使用trunc log on chkpt 选项及dump transaction with truncate_only,dump transaction with no_log 命令。若想备份,应做dump transaction database_name to dumpdevice。
七、管理大的transactions
有些操作是大批量地修改数据,log增长速度十分快,如:
◆大量数据修改
◆删除一个表的所有记录
◆基于子查询的数据插入
◆批量数据拷贝
下面讲述怎样使用这些transaction 使log 不至溢满:
大量数据修改
例:
1>;update large_tab set col_1=0
2>;go
若这个表很大,则此update动作在未完成之前就可能使log满,引起1105错误(log full)而且执行这种大的transaction所产生的exclusive table loc,阻止其他用户在update期间修 改这个表,这可能引起死锁。为避免这些情况,我们可以把这个大的transaction分成几个小 的transactions,并执行dump transaction 动作。
上述例子可以分成两个或多个小transactions.
例如:
1>;update large_tab set col1=0
2>;where col2 3>;go
1>;dump transaction database_name with truncate_only
2>;go
1>;update large_tab set col1=0
2>;where col2>;=x
3>;go
1>;dump transaction database_name with truncate_only
2>;go
若这个transaction 需要备份到介质上,则不用with truncate_only 选项。若执行dump transaction with truncate_only,应该先做dump database 命令。
删除一个表的所有记录
例:
1>;delete table large_tab
2>;go
同样,把整个table的记录都删除,要记很多log,我们可以用truncate table命令代替上 述语句完成相同功能。
1>;truncate table large_tab
2>;go
这样,表中记录都删除了,而使用truncate table 命令,log只记录空间回收情况,而不 是记录删除表中每一行的操作。
基于子查询的数据插入
例:
1>;insert new_tab select col1,col2 from
large_tab
2>;go
同样的方法,对这个大的transaction,我们应该处理为几个小的transactions。
1>;Insert new_tab
2>;select col1,col2 from large_tab where col1<=y
3>;go
1>;dump transaction database_name with truncate_only
2>;go
1>;insert new_tab
2>;select col1,col2 from large_tab where col1>;y
3>;go
1>;dump database database_name with truncate_only
2>;go
同样,若想保存log到介质上,则dump transaction 后不加with truncate_only 选项。若 执行dump transaction with truncate_only,应该先做dump database 动作。
批量数据拷贝
在使用bcp把数据拷入数据库时,我们可以把这个大的transaction变成几个小的 transactions处理,避免log剧增。
开放trunc log on chkpt 选项
1>;use master
2>;go
1>;sp_dboption database_name,trunc,true
2>;go
1>;use database_name
2>;go
1>;checkpoint
2>;go
bcp... -b 100 (on unix)
bcp... /batch_size=100(on vms)
关闭trunc log on chkpt选项,并dump database,
在这个例子中,一个批执行100行拷贝。也可以将bcp输入文件分成两或多个分开的文件, 在每个文件执行后做dump transaction 来避免log 满。
若bcp使用快速方式(无索引,无triggers),这样操作不记log,换句话说,log 只记载 空间分配情况。在这种情况下,要先做dump database(为恢复数据库用)。若log太小,可置 trunc log on chkpt 选项,这样在每次checkpoint后清除log。
八、Threshold 和transaction log 管理
SQL Server提供阈值管理功能,它能帮助用户自动监视数据库log设备段的自由空间。
在使用Sybase数据库管理系统(SQL Server)开发企业应用系统时,或者开发好的数据库 应用系统投入实际运行后,由于用户不断地增加或者修改数据库中的数据,用户数据库的自由 存储空间会日益减少。特别是数据库日志,增长速度很快。一旦自由空间用尽,SQL Server在 缺省情况下挂起所有数据操纵事务,客户端应用程序停止执行。这样有可能会影响企业日常业 务处理流程。Sybase SQL Server System10提供自动监视数据库自由存贮空间的机制——阈值 管理,当数据库使用剩余空间低于一定值时,通过执行一个自定义的存储过程,来控制自由空 间。在空间用完之前,采取相应措施,这样有利于业务处理顺利进行。如果能充分利用SQL Server的阈值管理功能,用户能使一些数据库管理工作自动化,规程化。所以,在此我们将 SQL Server这一重要功能介绍给读者。
SQL Server的阈值管理允许用户为数据库的某个段上的自由空间设置阈值和定义相应的存 储过程。当该段上的自由空间低于所置阈值时,SQL Server自动运行相应存储过程。与阈值相 对应的存储过程由用户定义,SQL Server不提供。一般来说,数据库管理员可通过这些存储过 程来完成一些日常管理事务,例如:
◆备份数据库,清理日志和删除旧数据
◆备份数据库日志
◆扩展数据库空间
◆拷贝出表中的内容,清理日志,等等。
1.段(Segment)
SQL Server的阈值管理是基于段(Segment)的,因此,让我们先回顾一下段的概念。每个 数据库创建时,它有三个缺值段:(1)System段;(2)default段;(3) logsegment段。 以后,还可以为该数据库增加用户自定义段。将来所有的数据库对象都建立在这些段上,要么 是系统定义的段,要么是用户定义的段。数据库的系统表存放在System段上。在没有指明段时 ,建立的对象存放在default段上。数据库的事务日志放在logsegment段上,该段是通过使用 建立数据库( Create database )命令的log on 选项来定义的。
2.最后机会阈值(Last_chance Threshold)
缺省情况下,SQLServer监测日志段的自由空间,当自由空间量低于事务日志能成功转储的 需要时,SQL Server运行sp_ thresholdaction过程。此自由空间量称为最后机会阈值( Last_chance threshold ),它由SQL Server计算得来,并且用户不能改变。
sp_thresholdaction必须由用户编写,SQL Server不提供。另外,如果最后机会阈值越出 ,那么在日志空间释放前,SQL Server一直挂起所有事务。但可以使用sp_dboption对某一数 据库来改变这一行为。设置abort tran on log full选项为true,可使得最后机会越出时, SQL Server撤回所有还未被注册的事务。
3.阈值管理
系统缺省建立最后机会阈值,由用户编写缺省阈值处理存储过程( sp_thresholdaction ),来控制自由空间。除此之外,还可以使用以下存储过程管理阈值:
◆sp_addthreshold 建立一个阈值
◆sp_dropthreshold 删除一个阈值
◆sp_helpthreshold 显示阈值有关的信息
◆sp_dboption 改变阈值的“挂起或取消”行为和取消阈值管理
◆sp_helpsegment 显示某个段上空间大小和自由空间大小的信息
4.增加阈值(sp_addthreshold)
它用于创建阈值( threshold )来监测数据库段中空间的使用。如果段中自由空间低于指 定值,SQL Server运行有关的存储过程。增加阈值的命令语法为:
sp_addthreshold database, segment, free_pages, procedure
其中:
◆database——要添加阈值的数据库名。必须是当前数据库名称。
◆segment——其自由空间被监测的段。当指定“default“ 段时要用引号。
◆free_pages——阈值所指的自由空间页数。当段中自由空间低于该标准时,SQL Server 运行有关存储过程。
◆procedure——当segment中的自由空间低于free_pages时,SQL server 执行该存储过程 。该过程可以放置在当前SQL Server或Open server的任意数据库中。但是,超出阈值时,不 能执行远程SQL Server上的存储过程。
例如:sp_addthreshold pubs2, logsegment, 200, dump_transaction
其中,存储过程定义为:
create procedure dump_transaction
@ dbname varchar (30),
@ segmentname varchar (30),
@ space_left int,
@ status int
as
dump transaction @dbname to “/dev/rmtx”
那么,当日志段上可用空间小于200页时,SQL Server运行存储过程dump_transaction,将 pubs2 数据库的日志转储到另一台设置上。
sp_addthreshold不检查存储过程存在已否。但当阈值越出时,如果存储过程不存在,SQL Server把错误信息送到错误日志( errorlog )中。系统允许每个数据库有256个阈值,而同 一段上二个阈值之间的最小空间为128页。其存储过程可以是系统存储过程,也可是在其它数 据库里的存储过程,或者Open Server远过程调用。
5.删除阈值(sp_dropthreshold)
它删除某个段的自由空间阈值,但是不能删除日志段的最后机会阈植。删除阈值的命令语 法为:
sp_dropthreshold database_name,segment_name,free_pages
其中三个参数分别为:阈值所属数据库名,阈值所监测的自由空间的段名,和自由空间页 。例如:
sp_dropthreshold pubs2, logsegment, 200 (删除 pubs2库中logsegment段的阈值200)
6.显示阈值(sp_helpthreshold)
它报告当前数据库上与所有阈值有关的段,自由空间值,状态以及存储过程或报告某一特 定段的所有阈值。显示阈值的语法为:
sp_helpthreshold [segment_name]
其中segment_name是当前数据库上一个段的名字。
例如:
◆sp_helpthreshold logsegment 显示在日志段上的所有阈值
◆sp_helpthreshold 显示当前数据库上所有段上的全部阈值
7.sp_dboption的新选择
abort xact when log is full
当日志段的最后机会阈值被超越时,试图往该日志段上记日志的用户进程将被挂起还是被 撤回?缺省情况下系统挂起所有进程。但是可以使用sp_aboption改变它。执行sp_dboption salesdb,"abort xact when log is full",true 命令后,一旦日志满了,则数据库修改事 务将会被回滚。
disable free space acctg
这个选择取消数据库中的阈值管理,但不影响最后机会阈值。执行:sp_dboption saledb, "disable free space acctg",true 它取消对非日志段上自由空间的统计。取消后,对系统 有以下影响:
◆SQL Server仅计算日志段上的自由空间
◆日志段上的阈值继续处于活动状态
◆在数据段上,系统表不改变,并且sp_spaceused得到的值是该选择被取消时刻的值
◆数据库段上的阈值失效
◆恢复加快
8.阈值的触发过程
频繁的插入和删除可能会使数据库段中的空间波动,阈值可能被多次超越,SQL Server使 用系统变量@@thresh_hysteresis,避免连续触发阈值存储过程。它的值由SQL Server设定。 在system 10.0中,@@thresh_hysteresis是64页。
因此,增加一个阈值,它必须与下一个最近的阈值相距至少2*@@thresh_hysteresis页。
一个阈值被触发,需要以下几个条件成立:
◆必须到达阈值
◆阈值处于活动状态(即它被建立后或者自由空间达到阈值减于@@thresh_hysteresis)
◆只有自由空间减少阈值才触发,如果自由空间增加,它永远不触发
篇3:SQL Server:例题
1、编写一段程序:输出1-1000之间的质数,并保存到一个新的质数表(序号, 质数)中,
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
create table 质数表(序号 int identity(1,1),质数 int)
declare @i int, @j int, @flag bit -- @i外循环变量, @j内循环变量, @flag表示是否质数的旗标
set @i=2
while @i<=1000 -- 从2到1000,检查数字看是否指数
begin
set @flag=1
set @j=2
while @j<=SQRT(@i) -- 从2到平方根,看是否整除
begin
if @i%@j=0
begin
set @flag=0
break -- ①不是质数就可以退出内循环了
end
set @j=@j+1
end
if @flag=1
insert into 质数表(质数) values(@i)
set @i=@i+1
end -- ②注意缩进和对齐!!!比如每个循环的begin, end。
www.dnzg.cn
2、编写一个函数:要求反置一段文本后,单词首字母大写输出。例如输入 I am Frank。输出Knarf Ma I。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
create function 反置文本(@string varchar(5000))
returns varchar(5000) -- 参数和返回类型
as
begin
declare @i int, @flag bit -- @flag是大小写旗标
declare @reverse varchar(5000), @result varchar(5000)
set @i=1 -- 第一次循环,先实现反置,结果保存到@reverse
set @reverse=''
while(@i<=LEN(@String))
begin
set @reverse=SubString(@string, @i,1)+@reverse
set @i=@i+1
end
set @i=1 -- 第二次循环,再实现首字母大小写,结果保存到@result
set @flag = 1
set @result=''
while(@i<=LEN(@reverse))
begin
if @flag = 1
set @result=@result + Upper(SubString(@reverse, @i,1))
else
set @result=@result + Lower(SubString(@reverse, @i,1))
if SubString(@reverse, @i,1) in (' ', '.')
set @flag = 1
else
set @flag = 0
set @i=@i+1
end
return(@result)
end
篇4:如何安装 SQL Server
本分步指南介绍如何安装 SQL Server 2000 基本的本地安装,
注意:SQL Server 2000(64 位)使用 Windows 安装程序将 SQL Server 功能的安装完全集成到一个功能树中。不再提供最小安装和典型安装。有关更多信息,请参阅 SQL Server 2000(64 位)文档。
安装 SQL Server 2000
将 Microsoft SQL Server 2000 安装光盘插入到您的 CD-ROM 驱动器中(如果光盘未自动运行,则双击光盘根目录下的 Autorun.exe 文件),选择SQL Server 2000 组件,然后选择安装数据库服务器。安装程序将准备启动 SQL Server 安装向导。在欢迎页上,单击下一步。 在计算机名对话框中,本地计算机是默认选项,并且本地计算机名将出现在文本框中。单击下一步。 在安装选项对话框中,单击“创建新的 SQL Server 实例,或安装客户端工具”,然后单击下一步。按照“用户信息、软件许可协议”和相关页面上的说明进行操作。在安装定义对话框中,单击“服务器和客户端工具”,然后单击下一步。 在实例名对话框中,如果默认复选框可用,则既可以安装默认实例,也可以安装命名实例。如果默认复选框不可用,则表示已经安装了默认实例,因此只能安装命名实例。 若要安装默认实例,请选中默认复选框,然后单击下一步, 若要安装命名实例,请取消选中默认复选框,在实例名称框中键入一个新的命名实例,然后单击下一步。在安装类型对话框中,单击典型或最小,然后单击下一步。 在服务帐户对话框中,接受默认设置,键入您的域密码,然后单击下一步。在身份验证模式对话框中,接受默认设置,然后单击下一步。完成所有指定的选项后,在开始复制文件对话框中单击下一步。 在选择许可模式对话框中,根据您的许可协议进行选择,然后单击继续,开始进行安装。在安装成功对话框中,单击“是的,我想立即重新启动我的计算机”,然后单击完成。仅安装 SQL Server 2000 的客户端工具
将 Microsoft SQL Server 2000 安装光盘插入到您的 CD-ROM 驱动器中(如果光盘未自动运行,则双击光盘根目录下的 Autorun.exe 文件),然后选择SQL Server 2000 组件。 选择安装数据库服务器。安装程序将准备启动SQL Server 安装向导。在欢迎页上,单击下一步。 在计算机名对话框中,本地计算机是默认选项,并且本地计算机名将出现在文本框中。单击下一步。 在安装选项对话框中,单击“创建新的 SQL Server 实例,或安装客户端工具”,然后单击下一步。 按照用户信息、软件许可协议和相关页面上的说明进行操作。 在安装定义对话框中,单击仅连接,然后单击下一步。 在开始复制文件对话框中,单击下一步,完成安装。篇5:什么是sql server
SQL Server是微软公司开发的数据库产品,SQL Server 被广泛使用,很多电子商务网站、企业内部信息化平台等都是基于SQL Server产品上,
微软下一代数据库Microsoft SQL Server 支持英特尔下一代的安腾处理器和AMD的下一代 64位处理器Opteron。7月,微软已经发布了 Microsoft SQL Server 2005 的最新测试版。
据称,SQL Server 2005增加多项数据管理,开发工具和商业只能等功能。
管理工具方面,SQL Server 2005包含管理工具SQL Server Management Studio (先前被称为“Workbench”),Management Studio将Enterprise Manager、Query Analyzer 及 Analysis Manager 的功能结合为一整合管理工具,并支持SQL Server Reporting Services、Notification Services、XML 及 SQL Server 2005 Mobile Edition ,
SQL Server 2005 大幅简化单一或多重 SQL Server 数据库的管理和执行。
另外,SQL Server 2005推出二个微型版本。SQL Server 2005 Express Edition,提供建立简单数据创立应用程式而设计的嵌入式数据库。SQL Server 2005 Mobile Edition是 SQL Server Windows CE Edition 的下一版,除扩充对Pocket PC的支持外,同时包含 Tablet PC,以及未来即将发行以Windows Mobile为架构的智能手机(Smartphone)。
篇6:sql server: sql script
select ProductGUID,ProductName,ProjectGUID from dbo.Product/*F637A079-E22B-4E50-87E9-000147B1B1F4产品5 4CB304EF-2135-43E7-90D6-B03B75CB491B C731BDB9-1436-4A23-A4FA-001097DF8218产品4 471C3F21-B725-497C-9383-6ED7C97756D8 4CF14E4B-495F-4344-801F-001D4C731494产品1 0BF32124-1963-4A5A-920C-036B2A0A2186 71344D5D-9994-4DC7-ABF6-00546C11565C产品3 A7E60BCF-1FA0-4D00-AE36-50C61074119F F182ED1B-DACB-43A0-958B-005C5174429F产品3 645E2033-9CE8-44E3-89E8-F7638E6108CB 76C87E67-E3DE-4D0D-8256-005DADE4118D产品5 F85302F9-31A4-447B-A0CE-9F5586B5AB4C 76F4E739-9EE5-4570-B93E-00620E6954A2产品2 4815811E-9F9C-46B1-AA46-8A98A967F233 494A2EBD-D414-4470-A9A8-006346620755产品5 CD6CA57C-6398-4C4B-91A4-9C5A22C0991D D8EC93CE-D3E6-48CE-B276-006D7FE1F9FC产品3 94B1FF27-49F7-4196-BA89-88AF71F27C49 C2EB45AB-5C0D-43E1-82F4-00795920FF1D产品4 BCBD7C06-D963-44B6-AF79-550831B1CE53 5BB124D2-6748-4514-992D-009AD0C01DD6产品1 EED22E55-FB42-42AE-9919-8D13BCF47506 29C1840B-E73F-4BF4-BE62-00E8A3EB8D95产品5 83E68000-94B8-42DD-BE71-BC3AF1A11677 */select ProjectGUID,ProjectName from dbo.Project/*F1C24DA5-072A-40E4-8451-0081FF5B0678项目286 2158A228-F248-46AA-98FB-008F84A183A4项目187 582B7C29-D7BA-4FA3-BE26-01AE3973C2AF项目122 D8F179DF-9844-4CF8-AFAA-01C64296A14E项目95 8EE3A6A8-D73F-45C5-B09F-024214D3项目62 AD86DBC2-AA91-4940-9C27-02B5734C3EC6项目367 2468F381-C1F9-4E0B-B0DF-032063BCAAC4项目70 0BF32124-1963-4A5A-920C-036B2A0A2186项目336 1E75C1E0-2829-43C8-9031-04624215C738项目377 21B31D71-0678-4229-80A8-0539023F9F6F项目4 15ED25B3-103A-415E-AF91-058BE0AE0600项目8 EE4F7336-9629-425B-ABCF-0662F01EEECB项目470 9374A1E0-54F8-49C7-A02C-0675F46E153D项目63 1CE94186-510F-4B6B-BE4B-06C9362951EF项目137 FC1DDDAB-3B92-424A-856C-082DEB91A1B3项目9 3F1AA58F-28A3-402F-9CE7-086C26998C17项目210 08601BA9-767F-4F92-941F-08C9EBFCA3A4项目466 */--SaleNum: 套数(INT)--SaleArea:面积(MONEY)--SalePrice:单价(MONEY)--SaleAmount:销售中加(MONEY)select SaleDtlGUID,ProductGUID,YearMonth,SaleNum,SaleArea,SalePrice,SaleAmount,[Year],[Month] from dbo.SaleDtl/*D9023E32-D981-4DB1-82EA-A8296FBF6A8AF637A079-E22B-4E50-87E9-000147B1B1F4 -04 7 700.0000 6000.0000 4200000.0000 2013 04 BEDF4CED-0C39-45EA-97BF-7C298C1D8A5BF637A079-E22B-4E50-87E9-000147B1B1F4 -11 9 900.0000 5000.0000 4500000.0000 2008 11 63DE92BA-4C08-4FF1-9A68-27CD4293084AF637A079-E22B-4E50-87E9-000147B1B1F4 -08 12 1200.0000 7000.0000 8400000.0000 2014 08 BC874228-B13F-4E49-9560-3CD39FF2B8A9F637A079-E22B-4E50-87E9-000147B1B1F4 -05 12 12000.0000 7000.0000 84000000.0000 2011 05 164FA80F-3ECF-4E82-86A1-A7F832867028F637A079-E22B-4E50-87E9-000147B1B1F4 2011-04 7 700.0000 6000.0000 4200000.0000 2011 04 7EC32C1E-F34B-4BF1-9BA4-5205C2C322F0F637A079-E22B-4E50-87E9-000147B1B1F4 -05 12 12000.0000 7000.0000 84000000.0000 2010 05 278D72A4-F340-4DB9-8083-7BD277EB7C9EF637A079-E22B-4E50-87E9-000147B1B1F4 2013-11 9 900.0000 5000.0000 4500000.0000 2013 11 E70EF3D1-A92C-45C1-A7D3-110A57C93CF0F637A079-E22B-4E50-87E9-000147B1B1F4 -08 12 1200.0000 7000.0000 8400000.0000 2015 08 26D1A828-26EE-4B9E-BEEF-A6F0A74CDE9EF637A079-E22B-4E50-87E9-000147B1B1F4 -02 8 800.0000 3500.0000 2800000.0000 2007 02 FD59AF4A-447D-4860-B2C2-10B0FD8C7531F637A079-E22B-4E50-87E9-000147B1B1F4 -03 5 500.0000 5000.0000 2500000.0000 2006 03 9288807A-C53A-44FA-B9AF-A69E0BF1C4CEF637A079-E22B-4E50-87E9-000147B1B1F4 2006-02 8 800.0000 3500.0000 2800000.0000 2006 02 CF001CD9-BC4D-4FB8-B39E-0FE41D2468A8F637A079-E22B-4E50-87E9-000147B1B1F4 2011-08 12 1200.0000 7000.0000 8400000.0000 2011 08 608070DC-53F0-46E0-B5F8-102106786073F637A079-E22B-4E50-87E9-000147B1B1F4 -04 7 700.0000 6000.0000 4200000.0000 2012 04 9869C12C-0896-4C17-B575-3A2C52CBCE13F637A079-E22B-4E50-87E9-000147B1B1F4 2014-10 3 300.0000 5000.0000 1500000.0000 2014 10 705F790B-23F3-4C9D-A9DA-A4B5799D1D56F637A079-E22B-4E50-87E9-000147B1B1F4 2007-01 10 1000.0000 4000.0000 4000000.0000 2007 01 050DA0EE-8862-4F0F-92FE-A521208F09C3F637A079-E22B-4E50-87E9-000147B1B1F4 -12 6 600.0000 5000.0000 3000000.0000 2009 12 6E0903D3-204E-4E3E-A737-39FCF7B434E8F637A079-E22B-4E50-87E9-000147B1B1F4 2010-08 12 1200.0000 7000.0000 8400000.0000 2010 08 22A0FC81-77C1-4B37-9DA8-24166AF7A490F637A079-E22B-4E50-87E9-000147B1B1F4 2011-07 8 800.0000 8000.0000 6400000.0000 2011 07 DDBDE42E-4986-44AC-BE77-8EC381356820F637A079-E22B-4E50-87E9-000147B1B1F4 2014-11 9 900.0000 5000.0000 4500000.0000 2014 11 6A7B23A3-C48B-4519-986D-3901CCFA50AEF637A079-E22B-4E50-87E9-000147B1B1F4 2010-04 7 700.0000 6000.0000 4200000.0000 2010 04 1BA93EC8-CB89-4DA5-B27C-239A43099214F637A079-E22B-4E50-87E9-000147B1B1F4 2009-04 7 700.0000 6000.0000 4200000.0000 2009 04 *//*临时表说明#product:用项目过滤后,将“合计”作为一个产品的集合#TempAllSaleDtl:通过项目过滤后的销售明细,所有月的#ProductSaleArea:各个产品的总面积,用于计算比例#TempSaleDtl:通过日期过滤,且加工过后的销售明细,包括增加累积列,以前年度、以后年度、项目合计的记录#tempSaleDtl2:列转行后的数据集#tempSaleDtl3:行转列后的数据集*/DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份--查找该项目的所有产品放进临时表#product,这里将“合计”作为一个产品的集合也插入产品表#product:select ProductGUID,ProductName,ProjectGUID,ProductCode into #productfrom(select ProductGUID,ProductName,ProjectGUID,ProductName as ProductCode from Productwhere ProjectGUID=@ProjectGUID union all select '00000000-0000-0000-0000-000000000000','合计',@ProjectGUID,'00' as ProductCode) aGO--查找该项目的所有产品的销售明细放进临时表#TempAllSaleDtl,以作备用:DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份SELECT ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice INTO #TempAllSaleDtl FROM dbo.SaleDtlWHERE ProductGUID IN (SELECT ProductGUID FROM dbo.Product WHERE ProjectGUID=@ProjectGUID)go--根据#TempAllSaleDtl现有数据统计,向#TempAllSaleDtl添加总合计记--根据现有数据统计,向#TempAllSaleDtl添加总合计记录insert into #TempAllSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice)select '00000000-0000-0000-0000-000000000000',YearMonth,SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea)from #TempAllSaleDtl group by YearMonthgo--从临时表#TempAllSaleDtl 中查找指定年的销售明细放进临时表#TempSaleDtl ,注意 这个时候就已经包含了 “合计”产品00的数据:--查找某年的销售明细:#TempSaleDtlDECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份SELECT ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,SalePrice AS ljSaleArea,SalePrice AS blSaleArea,SalePrice AS ljSaleAmountINTO #TempSaleDtl FROM #TempAllSaleDtl WHERE LEFT([YearMonth],4)=@Yeargo--从临时表#TempAllSaleDtl 中查找指定年的销售明细放进临时表#TempSaleDtl ,注意 这个时候就已经包含了 “合计”产品00的数据:--查找某年的销售明细:#TempSaleDtlDECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份SELECT ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,SalePrice AS ljSaleArea,SalePrice AS blSaleArea,SalePrice AS ljSaleAmount INTO #TempSaleDtlFROM #TempAllSaleDtl WHERE LEFT([YearMonth],4)=@Yeargo--从#TempAllSaleDtl 中统计项目各个产品的总销售面积放入表:#ProductSaleArea,主要用作计算 项目累计销售面积比例--获取项目各个产品的总销售面积:#ProductSaleAreaSELECT ProductGUID,SUM(SaleArea) AS all_SaleArea INTO #ProductSaleArea FROM #TempAllSaleDtl GROUP BY ProductGUIDgo--从表#TempSaleDtl 统计当前年度合计列,各产品的所有面积、金额、均价总合计 放入表#TempSaleDtl,注意这里 SUM(SaleAmount)/SUM(SaleArea) 计算销售单价:--添加2011合计列的记录(本年度的各产品的所有面积、金额、均价总合计)DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份insert into #TempSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,@Year+'-13',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0from #TempSaleDtl group by ProductGUIDGO--从表#TempAllSaleDtl 统计以前年度的各产品的所有面积、金额、均价总合计 操作与上一步类似 放入表#TempSaleDtl--以前年度列记录(本年度以前的各产品的所有面积、金额、均价总合计 操作与上一步类似)DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份insert into #TempSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,@Year+'-00',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0 from #TempAllSaleDtlwhere YearMonth=@Year+'-00'group by ProductGUIDGO--从表#TempAllSaleDtl 统计以后年度的各产品的所有面积、金额、均价总合计 操作与上一步类似 放入表#TempSaleDtl--以后年度列记录(本年度以后的各产品的所有面积、金额、均价总合计 操作与上一步类似)DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份insert into #TempSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,'9999-12',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0from #TempAllSaleDtlwhere YearMonth >cast((cast(@Year as int) +1) as CHAR(4))+'-00'group by ProductGUIDgo--从表#TempAllSaleDtl 统计各产品取所有的合计 放入表#TempSaleDtl--项目合计列记录(各产品取所有的合计,
sql server: sql script
。与上面的区别在于没有添加 here YearMonth >cast((cast(@Year as int) +1) as CHAR(4))+'-00')insert into #TempSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,'9999-13',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0from #TempAllSaleDtl group by ProductGUIDGO--从表#TempSaleDtl 与 #TempAllSaleDtl统计累积销售面积、累积销售面积比例,累积销售金额 更新表#TempSaleDtl--更新销售明细TempSaleDtl的累积销售面积、累积销售面积比例,累积销售金额UPDATE #TempSaleDtl SET ljSaleArea=b.sum_SaleArea,ljSaleAmount=b.sum_SaleAmount,blSaleArea=b.sum_SaleArea/c.all_SaleArea FROM #TempSaleDtl left JOIN(SELECT n.ProductGUID,n.YearMonth,SUM(m.SaleArea) AS sum_SaleArea,SUM(m.SaleAmount) AS sum_SaleAmount FROM #TempAllSaleDtl mINNER JOIN #TempSaleDtl n ON m.YearMonth=n.YearMonth AND m.ProductGUID=n.ProductGUID GROUP BY n.ProductGUID,n.YearMonth) b ON #TempSaleDtl.ProductGUID=b.ProductGUIDAND #TempSaleDtl.YearMonth=b.YearMonth LEFT JOIN #ProductSaleArea c ON c.ProductGUID=#TempSaleDtl.ProductGUIDGO--从表#TempSaleDtl 列转行,转换后的表只有 产品、统计类型、日期,值4列;(每个产品对应的0-12、13 月对应的值) 放入表#tempSaleDtl2--列转行,转换后的表只有 产品、统计类型、日期,值4列;(每个产品对应的0-12、13 月对应的值)SELECT * INTO #tempSaleDtl2 FROM (SELECT ProductGUID,'销售套数' AS type,'01' AS typecode,YearMonth,MAX(SaleNum) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonthUNION ALL SELECT ProductGUID,'销售面积' AS type,'02' AS typecode,YearMonth,MAX(SaleArea) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonthUNION ALL SELECT ProductGUID,'销售均价' AS type,'03' AS typecode,YearMonth,MAX(SalePrice) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonthUNION ALL SELECT ProductGUID,'销售金额' AS type,'04' AS typecode,YearMonth,MAX(SaleAmount) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonthUNION ALL SELECT ProductGUID,'累计销售面积' AS type, '05' AS typecode,YearMonth,SUM(ljSaleArea) FROM #TempSaleDtl GROUP BY ProductGUID,YearMonthUNION ALL SELECT ProductGUID,'累计销售面积比例' AS type, '06' AS typecode,YearMonth,SUM(blSaleArea) FROM #TempSaleDtl GROUP BY ProductGUID,YearMonthUNION ALL SELECT ProductGUID,'累计销售金额' AS type, '07' AS typecode,YearMonth,SUM(ljSaleAmount) FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth) tGO--从表#tempSaleDtl2行转列,按类型聚合 求出每个产品每个类型(面积、金额……)的合计 放入表#tempSaleDtl3]DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份SELECT ProductGUID,type,typecode, MAX(CASE YearMonth WHEN '9999-13' THEN val ELSE 0 END) AS '项目合计', MAX(CASE YearMonth WHEN @Year+'-00' THEN val ELSE 0 END) AS '以前年度合计', MAX(CASE YearMonth WHEN @Year+'-13' THEN val ELSE 0 END) AS '合计', MAX(CASE YearMonth WHEN @Year+'-01' THEN val ELSE 0 END) AS '2011-01', MAX(CASE YearMonth WHEN @Year+'-02' THEN val ELSE 0 END) AS '2011-02', MAX(CASE YearMonth WHEN @Year+'-03' THEN val ELSE 0 END) AS '2011-03', MAX(CASE YearMonth WHEN @Year+'-04' THEN val ELSE 0 END) AS '2011-04', MAX(CASE YearMonth WHEN @Year+'-05' THEN val ELSE 0 END) AS '2011-05', MAX(CASE YearMonth WHEN @Year+'-06' THEN val ELSE 0 END) AS '2011-06', MAX(CASE YearMonth WHEN @Year+'-07' THEN val ELSE 0 END) AS '2011-07', MAX(CASE YearMonth WHEN @Year+'-08' THEN val ELSE 0 END) AS '2011-08', MAX(CASE YearMonth WHEN @Year+'-09' THEN val ELSE 0 END) AS '2011-09', MAX(CASE YearMonth WHEN @Year+'-10' THEN val ELSE 0 END) AS '2011-10', MAX(CASE YearMonth WHEN @Year+'-11' THEN val ELSE 0 END) AS '2011-11', MAX(CASE YearMonth WHEN @Year+'-12' THEN val ELSE 0 END) AS '2011-12', MAX(CASE YearMonth WHEN '9999-12' THEN val ELSE 0 END) AS '以后年度合计'into #tempSaleDtl3FROM #tempSaleDtl2 GROUP BY ProductGUID,type,typecode ORDER BY ProductGUID,typecodeGOselect * from #tempSaleDtl3GO--从Project表中加入项目数据DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份select ProjectName as orderCode,ProjectGUID,ProjectName,'--' AS '项目合计','--' AS '以前年度合计','--' AS '20合计','--' AS '2011-01','--' AS '2011-02','--' AS '2011-03','--' AS '2011-04','--' AS '2011-05','--' AS '2011-06','--' AS '2011-07','--' AS '2011-08','--' AS '2011-09','--' AS '2011-10','--' AS '2011-11','--' AS '2011-12','--' AS '以后年度合计' from Project where ProjectGUID=@ProjectGUIDGOselect Project.ProjectName+'.'+a.ProductCode as orderCode,a.ProductGUID,a.ProductName,'--' AS '项目合计','--' AS '以前年度合计','--' AS '2011年合计','--' AS '2011-01','--' AS '2011-02','--' AS '2011-03','--' AS '2011-04','--' AS '2011-05','--' AS '2011-06','--' AS '2011-07','--' AS '2011-08','--' AS '2011-09','--' AS '2011-10','--' AS '2011-11','--' AS '2011-12','--' AS '以后年度合计' from #product a left join Project on a.ProjectGUID=Project.ProjectGUIDGO--从产品表和Project表、#tempSaleDtl3中加入类型行数据 select c.ProjectName+'.'+b.ProductCode+'.'+a.typecode as orderCode,a.ProductGUID, a.[type],cast(a.[项目合计] as varchar(20)),cast(a.[以前年度合计] as varchar(20)),cast(a.[2011年合计] as varchar(20)),cast(a.[2011-01] as varchar(20)),cast(a.[2011-02] as varchar(20)),cast(a.[2011-03] as varchar(20)),cast(a.[2011-04] as varchar(20)),cast(a.[2011-05] as varchar(20)),cast(a.[2011-06] as varchar(20)),cast(a.[2011-07] as varchar(20)),cast(a.[2011-08] as varchar(20)),cast(a.[2011-09] as varchar(20)),cast(a.[2011-10] as varchar(20)),cast(a.[2011-11] as varchar(20)),cast(a.[2011-12] as varchar(20)),cast(a.[以后年度合计] as varchar(20)) from #tempSaleDtl3 a left join #product b on a.ProductGUID=b.ProductGUID left join Project c on b.ProjectGUID=c.ProjectGUIDGO--从Project表中加入项目数据DECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'--要查询的项目DECLARE @Year CHAR(4)SET @Year='2011'--要统一的年份select * from ( select ProjectName as orderCode,ProjectGUID,ProjectName,'--' AS '项目合计','--' AS '以前年度合计','--' AS '2011年合计','--' AS '2011-01','--' AS '2011-02','--' AS '2011-03','--' AS '2011-04','--' AS '2011-05','--' AS '2011-06','--' AS '2011-07','--' AS '2011-08','--' AS '2011-09','--' AS '2011-10','--' AS '2011-11','--' AS '2011-12','--' AS '以后年度合计' from Project where ProjectGUID=@ProjectGUID----项目1 8FA659C8-3DA9-4330-B277-9B517E67606D 项目1 union all--从产品表和Project表中加入合计行数据 select Project.ProjectName+'.'+a.ProductCode as orderCode,a.ProductGUID,a.ProductName,'--' AS '项目合计','--' AS '以前年度合计','--' AS '2011年合计','--' AS '2011-01','--' AS '2011-02','--' AS '2011-03','--' AS '2011-04','--' AS '2011-05','--' AS '2011-06','--' AS '2011-07','--' AS '2011-08','--' AS '2011-09','--' AS '2011-10','--' AS '2011-11','--' AS '2011-12','--' AS '以后年度合计' from #product a left join Project on a.ProjectGUID=Project.ProjectGUIDunion ALL --从产品表和Project表、#tempSaleDtl3中加入类型行数据 select c.ProjectName+'.'+b.ProductCode+'.'+a.typecode as orderCode,a.ProductGUID, a.[type],cast(a.[项目合计] as varchar(20)),cast(a.[以前年度合计] as varchar(20)),cast(a.[2011年合计] as varchar(20)),cast(a.[2011-01] as varchar(20)),cast(a.[2011-02] as varchar(20)),cast(a.[2011-03] as varchar(20)),cast(a.[2011-04] as varchar(20)),cast(a.[2011-05] as varchar(20)),cast(a.[2011-06] as varchar(20)),cast(a.[2011-07] as varchar(20)),cast(a.[2011-08] as varchar(20)),cast(a.[2011-09] as varchar(20)),cast(a.[2011-10] as varchar(20)),cast(a.[2011-11] as varchar(20)),cast(a.[2011-12] as varchar(20)),cast(a.[以后年度合计] as varchar(20)) from #tempSaleDtl3 a left join #product b on a.ProductGUID=b.ProductGUID left join Project c on b.ProjectGUID=c.ProjectGUID) t1 order by orderCodeGOdrop table #productdrop table #TempAllSaleDtlDROP TABLE #TempSaleDtlDROP TABLE #tempSaleDtl2DROP TABLE #tempSaleDtl3DROP TABLE #ProductSaleAreaselect * from dbo.SaleDtlDBCC DROPCLEANBUFFERSDBCC FREEPROCCACHE--SET STATISTICS IO ON--SET STATISTICS TIME ONDECLARE @ProjectGUID UNIQUEIDENTIFIERSET @ProjectGUID='8FA659C8-3DA9-4330-B277-9B517E67606D'DECLARE @Year CHAR(4)SET @Year='2011'/*临时表说明#product:用项目过滤后,将“合计”作为一个产品的集合#TempAllSaleDtl:通过项目过滤后的销售明细,所有月的#ProductSaleArea:各个产品的总面积,用于计算比例#TempSaleDtl:通过日期过滤,且加工过后的销售明细,包括增加累积列,以前年度、以后年度、项目合计的记录#tempSaleDtl2:列转行后的数据集#tempSaleDtl3:行转列后的数据集*/select ProductGUID,ProductName,ProjectGUID,ProductCode into #productfrom(select ProductGUID,ProductName,ProjectGUID,ProductName as ProductCodefrom Product where ProjectGUID=@ProjectGUID union all select '00000000-0000-0000-0000-000000000000','合计',@ProjectGUID,'00' as ProductCode) a--SELECT * FROM #product----查找项目所有产品的销售明细:#TempAllSaleDtlSELECT ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice INTO #TempAllSaleDtlFROM dbo.SaleDtl WHERE ProductGUID IN ( SELECT ProductGUID FROM dbo.Product WHERE ProjectGUID=@ProjectGUID)--SELECT * FROM #TempAllSaleDtl--ORDER BY ProductGUID,YearMonth--根据现有数据统计,向#TempAllSaleDtl添加总合计记录insert into #TempAllSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice)select '00000000-0000-0000-0000-000000000000',YearMonth,SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea)from #TempAllSaleDtlgroup by YearMonth--SELECT * FROM #TempAllSaleDtl--ORDER BY ProductGUID,YearMonth--查找某年的销售明细:#TempSaleDtlSELECT ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice, SalePrice AS ljSaleArea, SalePrice AS blSaleArea, SalePrice AS ljSaleAmount INTO #TempSaleDtlFROM #TempAllSaleDtl WHERE LEFT([YearMonth],4)=@Year--SELECT * FROM #TempSaleDtl--ORDER BY ProductGUID,YearMonth--获取项目各个产品的总销售面积:#ProductSaleAreaSELECT ProductGUID,SUM(SaleArea) AS all_SaleArea INTO #ProductSaleArea FROM #TempAllSaleDtl GROUP BY ProductGUID--SELECT * FROM #ProductSaleArea--ORDER BY ProductGUID--添加2011合计列的记录(本年度的各产品的所有面积、金额、均价总合计)insert into #TempSaleDtl(ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,@Year+'-13',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0from #TempSaleDtl group by ProductGUID--SELECT * FROM #TempSaleDtl--ORDER BY ProductGUID,YearMonth--以前年度列记录(本年度以前的各产品的所有面积、金额、均价总合计 操作与上一步类似)insert into #TempSaleDtl( ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,@Year+'-00',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0from #TempAllSaleDtl where YearMonth=@Year+'-00'group by ProductGUID--SELECT * FROM #TempSaleDtl--ORDER BY ProductGUID,YearMonth--以后年度列记录(本年度以后的各产品的所有面积、金额、均价总合计 操作与上一步类似)insert into #TempSaleDtl( ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,'9999-12',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0 from #TempAllSaleDtlwhere YearMonth >cast((cast(@Year as int) +1) as CHAR(4))+'-00'group by ProductGUID--SELECT * FROM #TempSaleDtl--ORDER BY ProductGUID,YearMonth--项目合计列记录(各产品取所有的合计。与上面的区别在于没有添加 here YearMonth >cast((cast(@Year as int) +1) as CHAR(4))+'-00')insert into #TempSaleDtl( ProductGUID,YearMonth,SaleAmount,SaleArea,SaleNum,SalePrice,ljSaleArea, blSaleArea,ljSaleAmount)select ProductGUID,'9999-13',SUM(SaleAmount),SUM(SaleArea),SUM(SaleNum),SUM(SaleAmount)/SUM(SaleArea),0,0,0from #TempAllSaleDtl group by ProductGUID--SELECT * FROM #TempSaleDtl--ORDER BY ProductGUID,YearMonth--更新销售明细TempSaleDtl的累积销售面积、累积销售面积比例,累积销售金额UPDATE #TempSaleDtl SET ljSaleArea=b.sum_SaleArea, ljSaleAmount=b.sum_SaleAmount, blSaleArea=b.sum_SaleArea/c.all_SaleAreaFROM #TempSaleDtl left JOIN ( SELECT n.ProductGUID,n.YearMonth,SUM(m.SaleArea) AS sum_SaleArea,SUM(m.SaleAmount) AS sum_SaleAmount FROM #TempAllSaleDtl m INNER JOIN #TempSaleDtl n ON m.YearMonth=n.YearMonth AND m.ProductGUID=n.ProductGUID GROUP BY n.ProductGUID,n.YearMonth) b ON #TempSaleDtl.ProductGUID=b.ProductGUID AND #TempSaleDtl.YearMonth=b.YearMonthLEFT JOIN #ProductSaleArea c ON c.ProductGUID=#TempSaleDtl.ProductGUID--SELECT * FROM #TempSaleDtl--ORDER BY ProductGUID,YearMonth--列转行,转换后的表只有 产品、统计类型、日期,值4列;(每个产品对应的0-12、13 月对应的值)SELECT * INTO #tempSaleDtl2 FROM ( SELECT ProductGUID,'销售套数' AS type,'01' AS typecode,YearMonth,MAX(SaleNum) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth UNION ALL SELECT ProductGUID,'销售面积' AS type,'02' AS typecode,YearMonth,MAX(SaleArea) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth UNION ALL SELECT ProductGUID,'销售均价' AS type,'03' AS typecode,YearMonth,MAX(SalePrice) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth UNION ALL SELECT ProductGUID,'销售金额' AS type,'04' AS typecode,YearMonth,MAX(SaleAmount) AS val FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth UNION ALL SELECT ProductGUID,'累计销售面积' AS type, '05' AS typecode,YearMonth,SUM(ljSaleArea) FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth UNION ALL SELECT ProductGUID,'累计销售面积比例' AS type, '06' AS typecode,YearMonth,SUM(blSaleArea) FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth UNION ALL SELECT ProductGUID,'累计销售金额' AS type, '07' AS typecode,YearMonth,SUM(ljSaleAmount) FROM #TempSaleDtl GROUP BY ProductGUID,YearMonth) t--SELECT * FROM #tempSaleDtl2--ORDER BY ProductGUID,yearmonth--行转列,按日期聚合SELECT ProductGUID,type,typecode, MAX(CASE YearMonth WHEN '9999-13' THEN val ELSE 0 END) AS '项目合计', MAX(CASE YearMonth WHEN @Year+'-00' THEN val ELSE 0 END) AS '以前年度合计', MAX(CASE YearMonth WHEN @Year+'-13' THEN val ELSE 0 END) AS '2011年合计', MAX(CASE YearMonth WHEN @Year+'-01' THEN val ELSE 0 END) AS '2011-01', MAX(CASE YearMonth WHEN @Year+'-02' THEN val ELSE 0 END) AS '2011-02', MAX(CASE YearMonth WHEN @Year+'-03' THEN val ELSE 0 END) AS '2011-03', MAX(CASE YearMonth WHEN @Year+'-04' THEN val ELSE 0 END) AS '2011-04', MAX(CASE YearMonth WHEN @Year+'-05' THEN val ELSE 0 END) AS '2011-05', MAX(CASE YearMonth WHEN @Year+'-06' THEN val ELSE 0 END) AS '2011-06', MAX(CASE YearMonth WHEN @Year+'-07' THEN val ELSE 0 END) AS '2011-07', MAX(CASE YearMonth WHEN @Year+'-08' THEN val ELSE 0 END) AS '2011-08', MAX(CASE YearMonth WHEN @Year+'-09' THEN val ELSE 0 END) AS '2011-09', MAX(CASE YearMonth WHEN @Year+'-10' THEN val ELSE 0 END) AS '2011-10', MAX(CASE YearMonth WHEN @Year+'-11' THEN val ELSE 0 END) AS '2011-11', MAX(CASE YearMonth WHEN @Year+'-12' THEN val ELSE 0 END) AS '2011-12', MAX(CASE YearMonth WHEN '9999-12' THEN val ELSE 0 END) AS '以后年度合计'into #tempSaleDtl3 FROM #tempSaleDtl2GROUP BY ProductGUID,type,typecode ORDER BY ProductGUID,typecode--SELECT * FROM #tempSaleDtl3--ORDER BY ProductGUID,typecode--从Project表中加入项目数据select * from ( select ProjectName as orderCode,ProjectGUID,ProjectName,'--' AS '项目合计','--' AS '以前年度合计','--' AS '2011年合计','--' AS '2011-01','--' AS '2011-02','--' AS '2011-03','--' AS '2011-04','--' AS '2011-05','--' AS '2011-06','--' AS '2011-07','--' AS '2011-08','--' AS '2011-09','--' AS '2011-10','--' AS '2011-11','--' AS '2011-12', '--' AS '以后年度合计' from Project where ProjectGUID=@ProjectGUID----项目1 8FA659C8-3DA9-4330-B277-9B517E67606D 项目1 union all--从产品表和Project表中加入合计行数据 select Project.ProjectName+'.'+a.ProductCode as orderCode,a.ProductGUID,a.ProductName,'--' AS '项目合计','--' AS '以前年度合计','--' AS '2011年合计', '--' AS '2011-01','--' AS '2011-02','--' AS '2011-03','--' AS '2011-04','--' AS '2011-05','--' AS '2011-06','--' AS '2011-07','--' AS '2011-08','--' AS '2011-09','--' AS '2011-10','--' AS '2011-11','--' AS '2011-12','--' AS '以后年度合计' from #product a left join Project on a.ProjectGUID=Project.ProjectGUID union ALL --从产品表和Project表、#tempSaleDtl3中加入类型行数据 select c.ProjectName+'.'+b.ProductCode+'.'+a.typecode as orderCode,a.ProductGUID, a.[type],cast(a.[项目合计] as varchar(20)),cast(a.[以前年度合计] as varchar(20)),cast(a.[2011年合计] as varchar(20)), cast(a.[2011-01] as varchar(20)),cast(a.[2011-02] as varchar(20)),cast(a.[2011-03] as varchar(20)),cast(a.[2011-04] as varchar(20)),cast(a.[2011-05] as varchar(20)),cast(a.[2011-06] as varchar(20)),cast(a.[2011-07] as varchar(20)),cast(a.[2011-08] as varchar(20)),cast(a.[2011-09] as varchar(20)),cast(a.[2011-10] as varchar(20)),cast(a.[2011-11] as varchar(20)),cast(a.[2011-12] as varchar(20)),cast(a.[以后年度合计] as varchar(20)) from #tempSaleDtl3 a left join #product b on a.ProductGUID=b.ProductGUID left join Project c on b.ProjectGUID=c.ProjectGUID) t1 order by orderCodedrop table #productdrop table #TempAllSaleDtlDROP TABLE #TempSaleDtlDROP TABLE #tempSaleDtl2DROP TABLE #tempSaleDtl3DROP TABLE #ProductSaleAreaGO/*开盘调价报告-本次开盘产品列表*/ALTER PROC usp_s_KpTjReport_KpProduct (@PlanGUID UNIQUEIDENTIFIER , --开盘调价方案GUID@ProjGUID UNIQUEIDENTIFIER --所属项目GUID )AS SET NOCOUNT ON; ------------------------------------------------------------------------------------------------------------------------------------------- --1. 查询最新审核项目分解版本 ------------------------------------------------------------------------------------------------------------------------------------------- DECLARE @ProjAnalysisGUID UNIQUEIDENTIFIER SELECT TOP 1 @ProjAnalysisGUID=ProjAnalysisGUID FROM dbo.s_ProjAnalysis WHERE ProjGUID=@ProjGUID AND State='已审核' ORDER BY ShDate DESC --项目名称(用于分区全名称匹配) DECLARE @ProjName VARCHAR(400) SELECT @ProjName=ProjName FROM dbo.p_Project WHERE ProjGUID=@ProjGUID --SELECT @ProjAnalysisGUID ------------------------------------------------------------------------------------------------------------------------------------------- --2. 查询出要求格式的分区和业态名称,以及列表计算需要的数据 ------------------------------------------------------------------------------------------------------------------------------------------- SELECT A.RoomGUID, [ProductCode]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.Area2ProductTypeCode) ELSEMAX(CASE WHEN G.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.Area2ProductTypeCode END )END , [AreaName]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(ISNULL(D3.Area2ProductName+'-','')+ISNULL(D2.Area2ProductName+'-','')+D1.Area2ProductName) ELSEMAX(CASE WHEN G.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN ISNULL(D3.Area2ProductName+'-','')+ISNULL(D2.Area2ProductName+'-','')+D1.Area2ProductName END)END, [ProductName]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.Area2ProductName) ELSEMAX(CASE WHEN G.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.Area2ProductName END )END , [BldArea]=MAX(A.BldArea), [ToTal]=MAX(A.ToTal), [ZhDiscntRate]=CAST(MAX(F.ZhDiscntRate)/100 AS DECIMAL(5,3)) --综合折扣率保存为1-100 INTO #A FROM dbo.s_TjResult A INNER JOIN dbo.p_room B ON B.RoomGUID=A.RoomGUID INNER JOIN dbo.p_BuildProductType C ON C.BProductTypeCode=B.BProductTypeCode INNER JOIN dbo.s_Area2Product D ON D.ProductTypeGUID=C.BuildProductTypeGUID AND D.ProjAnalysisGUID=@ProjAnalysisGUID--试算房间所属产品 --可能有多条 LEFT JOIN dbo.s_Area2Product D1 ON D1.Area2ProductTypeCode=D.ParentCode AND D1.ProjAnalysisGUID=@ProjAnalysisGUID--产品所属分区 LEFT JOIN dbo.s_Area2Product D2 ON D2.Area2ProductTypeCode=D1.ParentCode AND D2.ProjAnalysisGUID=@ProjAnalysisGUID--产品所属分区上级分区 LEFT JOIN dbo.s_Area2Product D3 ON D3.Area2ProductTypeCode=D2.ParentCode AND D3.ProjAnalysisGUID=@ProjAnalysisGUID--产品所属分区上级分区上级分区 INNER JOIN dbo.p_Building E ON E.BldGUID=A.BldGUID--试算房间楼栋 INNER JOIN dbo.s_TjPlan F ON F.PlanGUID=@PlanGUID--开盘调价计划 LEFT JOIN dbo.p_Building G ON G.IsBld=0 AND G.ParentCode+'.'+G.BldCode=E.ParentCode AND B.ProjGUID=@ProjGUID--试算房间楼栋所属区域 WHERE A.PlanGUID=@PlanGUID GROUP BY A.RoomGUID HAVING COUNT(A.RoomGUID)=1 OR COUNT(CASE WHEN G.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN 1 END)=1 --SELECT * FROM #A ------------------------------------------------------------------------------------------------------------------------------------------- --3. 按业态计算指标 ------------------------------------------------------------------------------------------------------------------------------------------- SELECT AreaName=MAX(A.AreaName),ProductName=MAX(A.ProductName),RoomCount=COUNT(1),BldArea=CAST(SUM(ISNULL(A.BldArea,0)) AS DECIMAL(18,0))--面积,ZQJJ= CASE WHEN CAST(SUM(ISNULL(A.BldArea,0)) AS DECIMAL(18,0))=0 THEN 0 ELSECAST(SUM(ISNULL(A.ToTal,0))/10000 AS DECIMAL(18,0))/ CAST(SUM(ISNULL(A.BldArea,0)) AS DECIMAL(18,0)) END --折前均价(元/平米),ZQTotal=CAST(SUM(ISNULL(A.ToTal,0))/10000 AS DECIMAL(18,0))--折前总价(万元),ZSJJ= CASE WHEN CAST(SUM(ISNULL(A.BldArea,0)) AS DECIMAL(18,0))=0 THEN 0 ELSECAST(SUM(ISNULL(A.ToTal,0))/10000 AS DECIMAL(18,0))/ CAST(SUM(ISNULL(A.BldArea,0)) AS DECIMAL(18,0)) END * MAX(A.ZhDiscntRate)--折实均价(元/平米),ZSTotal= CAST(SUM(ISNULL(A.ToTal,0))/10000 AS DECIMAL(18,0))*MAX(A.ZhDiscntRate)--折实总价(万元),Remarks=MAX('综合折扣率为:'+CAST(CAST(A.ZhDiscntRate*100 AS DECIMAL(5,1))AS VARCHAR(5))+'%')--备注 INTO #B FROM #A A GROUP BY A.ProductCode ------------------------------------------------------------------------------------------------------------------------------------------- --4. 联合查询出列表展现结果 ------------------------------------------------------------------------------------------------------------------------------------------- SELECT AreaName=A.AreaName ,--分区ProductName ,--业态RoomCount ,--套数BldArea=CAST(BldArea AS DECIMAL(18,0)),--面积ZQJJ =CAST(ZQJJ AS DECIMAL(18,0)),--折前均价ZQTotal=CAST(ZQTotal AS DECIMAL(18,0)) ,--折前总价ZSJJ =CAST(ZSJJ AS DECIMAL(18,0)),--折实均价ZSTotal =CAST(ZSTotal AS DECIMAL(18,0)),--折实总价Remarks,--备注FqRowspan=CASE WHEN A.AreaName IS NULL THEN 1 ELSE B.FqRowspan END --当前分区下产品个数(用于Rowspan) FROM #B A INNER JOIN (SELECT AreaName,COUNT(1) AS FqRowspanFROM #BGROUP BY AreaName ) B ON B.AreaName IS NULL OR B.AreaName=A.AreaName--加入统计每个分区的产品个数 UNION ALL SELECT '合计',NULL,SUM(RoomCount) ,SUM(CAST(BldArea AS DECIMAL(18,0))),NULL,SUM(CAST(ZQTotal AS DECIMAL(18,0))),NULL,SUM(CAST(ZSTotal AS DECIMAL(18,0))),MAX(Remarks),1 FROM #B ORDER BY AreaName ASC,ProductName DESC --SELECT * FROM #A ORDER BY RoomGUID ------------------------------------------------------------------------------------------------------------------------------------------- --5. 删除临时表 ------------------------------------------------------------------------------------------------------------------------------------------- DROP TABLE #A DROP TABLE #BGO
/*开盘调价方案审批-工作流域取数*/ALTER PROC usp_s_KpTjReport_WF (@PlanGUID UNIQUEIDENTIFIER --开盘调价方案GUID )AS SET NOCOUNT ON; DECLARE @JcwjDiff DECIMAL(18,0)--累计实现业态均价与决策文件均价差额(当前未开票或未匹配业态则0,若任一业态均价小于0则为-1,否则为1) DECLARE @ProjGUID UNIQUEIDENTIFIER--当前项目GUID DECLARE @ProjAnalysisGUID UNIQUEIDENTIFIER--当前最新审核项目分解版本GUID DECLARE @PlanType VARCHAR(20)--当前方案类型 DECLARE @TjDiff DECIMAL(18,0)--调整前后总价差额合计(万元) DECLARE @TjTotal DECIMAL(18,0)--调价房间总价(万元) DECLARE @TjCount BIGINT--调价房间套数 ------------------------------------------------------------------------------------------------------------------------------------------- --1. 查询累计实现业态均价与决策文件均价差额 --1.1 获取当前项目和最新审核项目分解版本 ------------------------------------------------------------------------------------------------------------------------------------------- SET @JcwjDiff=0 --默认值 --项目GUID及报告类型 SELECT @ProjGUID=ProjGUID,@PlanType=PlanType FROM dbo.s_TjPlan WHERE PlanGUID=@PlanGUID --最新审核项目分解版本 SELECT TOP 1 @ProjAnalysisGUID=ProjAnalysisGUID FROM dbo.s_ProjAnalysis WHERE ProjGUID=@ProjGUID AND State='已审核' ORDER BY ShDate DESC --项目名称(用于分区全名称匹配) DECLARE @ProjName VARCHAR(400) SELECT @ProjName=ProjName FROM dbo.p_Project WHERE ProjGUID=@ProjGUID --SELECT @ProjGUID AS 项目,@PlanType AS 类型,@ProjAnalysisGUID AS 项目分解 IF( @PlanType='调价报告') BEGIN SELECT A.RoomGUID,--A.bldGUID,COUNT(A.RoomGUID) AS CRoomGUID,COUNT(A.BldGUID) AS CBld,COUNT(CASE WHEN C1.Area2ProductName=A.FqName THEN 1 END) AS C, [ProductCode]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.Area2ProductTypeCode) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.Area2ProductTypeCode END) END , [AreaName]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D1.Area2ProductName) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D1.Area2ProductName END) END, [ProductName]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.Area2ProductName) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.Area2ProductName END) END , [RgTotal]=MAX(E.CjTotal),--元 [RgBldArea]=MAX(E.BldArea), [HtTotal]=MAX(F.HtTotal),--元 [HtBldArea]=MAX(F.BldArea), [AttachRoomArea]=MAX(O.BldArea),--认购合同附属房产的面积 [KpDate]=MAX(H.KpDate), [RoomState]=MAX(B.Status), [TjTotal]=MAX(A.Total),--元 [RoomBzTotal]=MAX(B.Total),--元 [RoomBldArea]=MAX(B.BldArea), [XmFjPrice]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.SalePrice) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.SalePrice END) END ,--元 [BldSalePrice]=MAX(M.SalePrice) ,--元 [BldSaleArea]=MAX(M.SaleArea), [JcwjSaleTotal]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.SalePrice) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.SaleTotal END) END ,--万元 [JcwjSaleArea]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.SaleArea) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.SaleArea END) END , [JcwjSalePrice]=CASE WHEN COUNT(A.RoomGUID)=1 THENMAX(D.SalePrice) ELSEMAX(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN D.SalePrice END) END --元 INTO #A FROM dbo.s_TjResult A--对应业态分区INNER JOIN dbo.p_room B ON B.RoomGUID=A.RoomGUIDINNER JOIN dbo.p_BuildProductType C ON C.BProductTypeCode=B.BProductTypeCodeINNER JOIN dbo.s_Area2Product D ON D.ProductTypeGUID=C.BuildProductTypeGUID AND D.ProjAnalysisGUID=@ProjAnalysisGUID --可能有多条LEFT JOIN dbo.s_Area2Product D1 ON D1.Area2ProductTypeCode=D.ParentCode AND D1.ProjAnalysisGUID=@ProjAnalysisGUID--产品所属分区LEFT JOIN dbo.s_Area2Product D2 ON D2.Area2ProductTypeCode=D1.ParentCode AND D2.ProjAnalysisGUID=@ProjAnalysisGUID--产品所属分区上级分区LEFT JOIN dbo.s_Area2Product D3 ON D3.Area2ProductTypeCode=D2.ParentCode AND D3.ProjAnalysisGUID=@ProjAnalysisGUID--产品所属分区上级分区上级分区----对应合同订单LEFT JOIN dbo.s_order E ON E.RoomGUID =A.RoomGUID AND E.Status='激活'LEFT JOIN dbo.s_contract F ON F.RoomGUID =A.RoomGUID AND F.Status='激活'--合同订单附属房产(统计销售面积)LEFT JOIN dbo.s_OCAttachRoom O ON O.RoomGUID=A.RoomGUID AND O.SaleGUID IN(E.OrderGUID,F.ContractGUID)--一个房间不可能同时被认购和签约----对应开盘计划(取开盘日期)LEFT JOIN dbo.s_TjResult G ON G.RoomGUID=A.RoomGUID AND G.PlanGUID IN(SELECT PlanGUID FROM s_tjPlan WHERE PlanType='开盘报告' AND ProjGUID=@ProjGUID)--对应开盘计划的试算结果LEFT JOIN dbo.s_TjPlan H ON H.PlanGUID=G.PlanGUID--对应的开盘计划--对应开盘或调价试算结果(当房间做多个调价报告时,取最新制定的方案试算记录)LEFT JOIN dbo.s_TjResult K ON K.RoomGUID=A.RoomGUID AND K.PlanGUID IN (SELECT TOP 1 X.PlanGUIDFROMs_tjPlan X INNER JOIN ( SELECT PlanGUID FROM s_TjResult WHERE RoomGUID = A.RoomGUID ) L ON L.PlanGUID = X.PlanGUIDWHERE X.ShDate IS NOT NULL --要求已审核ORDER BY X.ZdDate DESC )INNER JOIN dbo.p_Building M ON M.IsBld=1 AND M.BldGUID=A.BldGUID--房间所属楼栋LEFT JOIN dbo.p_Building N ON N.IsBld=0 AND N.ParentCode+'.'+N.BldCode=M.ParentCode AND N.ProjGUID=@ProjGUID--楼栋所属区域 WHERE A.PlanGUID=@PlanGUID GROUP BY A.RoomGUID HAVING COUNT(A.RoomGUID)=1 OR COUNT(CASE WHEN N.BldFullName=@ProjName+ISNULL('-'+D3.Area2ProductName,'')+ISNULL('-'+D2.Area2ProductName,'')+ISNULL('-'+D1.Area2ProductName,'') THEN 1 END)=1 --SELECT * FROM #A ORDER BY [ProductCode] DESC IF(EXISTS (SELECT 1 FROM #A))--当未匹配业态,则决策文件均价差额为0 BEGIN---------------------------------------------------------------------------------------------------------------------------------------------1.3 按业态计算指标,获得预计整体可实现折实均价与决策文件差额-------------------------------------------------------------------------------------------------------------------------------------------SELECT A.ProductCode --预计整体可实现与决策文件差额 ,[Diff]=--'折实均价(元/平米)'CASE WHEN( ISNULL(SUM(CASE WHEN A.RoomState IN ('认购','签约') THEN ISNULL(A.RgBldArea,0)+ISNULL(A.HtBldArea,0)+ISNULL(A.[AttachRoomArea],0) END),0) +ISNULL( SUM(CASE WHEN DATEDIFF(DAY,GETDATE, A.[KpDate])<=0 AND A.RoomState NOT IN ('认购','签约') THEN A.[RoomBldArea] END),0) +ISNULL( SUM( CASE WHENISNULL(DATEDIFF(DAY,GETDATE(),A.[KpDate]),1)>0 THEN--如果所有楼栋都生成房间,则统计房间建筑面积之和--如果部分楼栋没有生成房间,则显示生成房间楼栋建筑面积之和+楼栋预计销售面积CASE WHEN A.RoomGUID IS NULL THEN A.[BldSaleArea] ELSE A.[RoomBldArea] END END ) ,0))=0 THEN 0 ELSE( ISNULL(SUM(CASE WHEN A.RoomState IN ('认购','签约') THEN ISNULL(A.RgTotal,0)+ISNULL(A.HtTotal,0) END),0) +ISNULL(SUM(CASE WHEN DATEDIFF(DAY,GETDATE(), A.[KpDate])<=0 AND A.RoomState NOT IN ('认购','签约') THEN A.[RoomBzTotal] END),0) + (ISNULL(SUM(CASE WHEN ISNULL(DATEDIFF(DAY,GETDATE(),A.[KpDate]),1)>0 AND ISNULL(A.[TjTotal],0)0 THEN A.[TjTotal] END),0)--未到推盘日期已经定价房间 的房间总价 +ISNULL(SUM(CASE WHEN ISNULL(DATEDIFF(DAY,GETDATE(),A.[KpDate]),1)>0 AND ISNULL(A.[TjTotal],0)=0 AND ISNULL(A.[RoomBzTotal],0)0 THEN A.XmFjPrice*A.[RoomBldArea] END),0)--未到推盘日期未定价房间 的房间总价 +ISNULL(SUM(CASE WHEN ISNULL(DATEDIFF(DAY,GETDATE(),A.[KpDate]),1)>0 AND NOT(ISNULL(A.[TjTotal],0)0) AND NOT(ISNULL(A.[TjTotal],0)=0 AND ISNULL(A.[RoomBzTotal],0)0) THEN A.[BldSalePrice]*A.[BldSaleArea] END),0)--未到推盘日期未定价的楼栋房间 ))/( ISNULL(SUM(CASE WHEN A.RoomState IN ('认购','签约') THEN ISNULL(A.RgBldArea,0)+ISNULL(A.HtBldArea,0)+ISNULL(A.[AttachRoomArea],0) END),0) +ISNULL( SUM(CASE WHEN DATEDIFF(DAY,GETDATE(), A.[KpDate])<=0 AND A.RoomState NOT IN ('认购','签约') THEN A.[RoomBldArea] END),0) +ISNULL( SUM( CASE WHENISNULL(DATEDIFF(DAY,GETDATE(),A.[KpDate]),1)>0 THEN--如果所有楼栋都生成房间,则统计房间建筑面积之和--如果部分楼栋没有生成房间,则显示生成房间楼栋建筑面积之和+楼栋预计销售面积CASE WHEN A.RoomGUID IS NULL THEN A.[BldSaleArea] ELSE A.[RoomBldArea] END END ) ,0)) END-ISNULL(MAX(A.[JcwjSalePrice]),0)INTO #A1FROM #A AGROUP BY A.ProductCode---------------------------------------------------------------------------------------------------------------------------------------------1.4 计算累计实现业态均价与决策文件均价差额--1.5 当其中有一个差额小于0,则均价差额返回-1--1.6 当所有差额都大于0,则均价差额返回1--1.7 删除临时表---------------------------------------------------------------------------------------------------------------------------------------------SELECT 1,* FROM #A1 IF(EXISTS(SELECT 1 FROM #A1 WHERE Diff<0)) SET @JcwjDiff=-1ELSE SET @JcwjDiff=1 DROP TABLE #A1 END ; DROP TABLE #A END ; --SELECT @JcwjDiff ------------------------------------------------------------------------------------------------------------------------------------------- --2. 查询调整前后总价差额合计 --2.1 最近一次执行的开盘或调价方案 --2.1 如果是“开盘报告”或之前没有报告则不计算 ------------------------------------------------------------------------------------------------------------------------------------------- --获取本次调价的审核日期(用于查看历史记录时筛选) DECLARE @ShDate DATETIME SELECT @ShDate=ShDate FROM dbo.s_TjPlan WHERE PlanGUID=@PlanGUID ------------------------------------------------------------------------------------------------------------------------------------------- --2.2 查询比较的基本信息 ------------------------------------------------------------------------------------------------------------------------------------------- SELECT A.RoomGUID,[ProductCode]=CASE WHEN COUNT(A.RoomGUID)=1 THEN MAX(E.Area2ProductTypeCode) ELSE MAX(CASE WHEN I.BldFullName=@ProjName+ISNULL('-'+E3.Area2ProductName,'')+ISNULL('-'+E2.Area2ProductName,'')+ISNULL('-'+E1.Area2ProductName,'') THEN E.Area2ProductTypeCode END ) END ,[OldSaleTotal]=MAX(B.Total),[NewSaleTotal]=MAX(A.Total),[OldBldArea]=MAX(B.BldArea),[NewBldArea]=MAX(A.BldArea),[OldZhDiscntRate]=CAST(MAX(H.ZhDiscntRate)/100 AS DECIMAL(5,3)), --综合折扣率保存为1-100[NewZhDiscntRate]=CAST(MAX(G.ZhDiscntRate)/100 AS DECIMAL(5,3)) --综合折扣率保存为1-100 INTO #B --SELECT C.RoomGUID,D.BuildProductTypeGUID,A.PlanGUID,B.PlanGUID FROM dbo.s_TjResult AINNER JOIN dbo.p_Room C ON C.RoomGUID=A.RoomGUIDINNER JOIN dbo.s_TjResult B ON b.RoomGUID=A.RoomGUID --房间对应的之前最近审核过的一次开盘调价方案试算 AND B.PlanGUID IN (SELECT TOP 1 X.PlanGUIDFROMs_tjPlan X INNER JOIN ( SELECT PlanGUID FROM s_TjResult WHERE PlanGUID@PlanGUID AND RoomGUID = A.RoomGUID ) Y ON Y.PlanGUID = X.PlanGUIDWHERE x.ShDate SQL Server 2012已经发布,在升级之前我们需要做一些准备,首先必须验证 软件和硬件需求;准备足够的资源,用于测试和实现新系统。但是,您可能忽略 了一些重要方面——处理SQL Server数据的客户端应用程序。 这正是SQL Server 2012的Upgrade Assistant(升级助手)的作用。Upgrade Assistant提供 了一种自动处理机制,用于测试从SQL Server 、2008或2008R2移植到SQL Server 2012的应用程序兼容性。使用Upgrade Assistant,可以检测升级过程中 可能发生的功能和性能问题。Upgrade Assistant可以验证应用程序的SQL Server 2012 Transact-SQL查询,可用于检测和纠正应用程序源代码的兼容性问题。 Upgrade Assistant是由微软和Scalability Experts Inc.合作开发。 Upgrade Assistant使用工作负载测试,对旧版本的SQL Server与SQL Server 2012的应用程序性能进行比较。如果按照产品文档所描述的步骤(同时考虑用户 界面的结构),就可以确定可能影响应用程序的问题,如弃用的特性或Transact -SQL语法变化。 Upgrade Assistant测试过程 Upgrade Assistant 可以指引您验证应用程序在SQL Server 2012的兼容性。在开始之前,要先创建用 于运行示例工作负载的测试环境。理论上,可以在生产数据库上执行测试,但是 这种方法存在一定的风险。因为这不仅会对运行的应用程序、后台数据库和网络 本身的性能产生负面影响,而且如果出现命名冲突或事务中断,就有破坏应用程 序和数据完整性的风险。 至少,您的测试环境应该包含一个数据库服务器 ,然后在其上安装当前版本的SQL Server(2005、2008或2008 R2)及Upgrade Assistant。服务器还必须支持SQL Server 2012升级。此外,您必须从所测试的 应用程序连接数据库服务器。应用程序应该是一个测试系统,以便执行自动化过 程,完全补全应用程序的特性。如果使用生产应用程序来执行测试,那么您很可 能只能检查到较小比例的功能。 一旦建立了测试环境,您就可以使用SQL Server Upgrade Assistant,执行以下步骤: 备份相关系统和用户数据库,获取示例工作负载。Upgrade Assistant会将工 作负载捕捉为跟踪文件,其中记录了有代表性的应用程序数据库查询记录。 基于第一步创建的备份和跟踪文件,建立基线环境。在这个过程中,运行SQL Server Upgrade Advisor,确定数据库跟踪文件和备份文件中的升级问题, 这时 ,您应该解决所有出现的问题,才能继续Upgrade Assistant后面的步骤。 使用第一步创建的工作负载跟踪示例重新建立一个基线跟踪。在最后一步,这 个基线跟踪将与SQL Server 2012跟踪进行对比。 将SQL Server实例升级到SQL Server 2012。 使用第一步创建的工作负载跟踪示例重新建立SQL Server 2012的升级跟踪。 对比基线跟踪与升级跟踪,确定运行示例工作负载可能产生的潜在问题。 毫无疑问,这些步骤仅仅是整个测试过程的概述,但是可以帮助您在部署SQL Server 2012之前,大概地了解如何使用Upgrade Assistant检查数据驱动的应用 程序。 SQL Server升级技术 您可能注意到,第二步需要运行SQL Server Upgrade Advisor。虽然它不属于Upgrade Assistant的组成部分,但却是 整个过程的重要组成部分。 只是Upgrade Advisor在名称上与Upgrade Assistant非常相似,可以分析准备升级到SQL Server 2012的现有SQL Server组 件。Upgrade Advisor会生成一个报告,确定在更新之前应该修复的SQL Server实 例问题。这个分析包括许多数据库对象,如触发器、存储过程、脚本和跟踪文件 。如果同时使用Upgrade Advisor和Upgrade Assistant,那么要加入第一步所创 建的工作负载跟踪示例。 在Upgrade Assistant测试过程中,另一个重要 的SQL Server 2012技术是Distributed Replay(分布式重放),这个工具可用于 评估硬件和操作系统的升级影响。与SQL Server Profiler相似,Distributed Replay可以在升级测试环境中重放所捕捉的跟踪。Upgrade Assistant增加了 Distributed Replay功能,实现比旧版本SQL Server更符合实际的性能测试。 实践证明,Upgrade Assistant工具适合所有提供数据驱动项目的组织使 用。最后一步是升级到SQL Server 2012,然后中断所有应用程序。然后,一定要 记住,SQL Server 2012会以兼容模式运行遗留数据库,相当于数据库创建时所使 用SQL Server版本。这样,您可以部署SQL Server 2012,但是仍然有足够的时间 优化应用程序性能。您的目标应该是将应用程序调整为运行在SQL Server 2012上 ,但是在此之前,您还有另一个选择。如果您已经准备升级应用程序,那么您会 发现Upgrade Assistant非常有用。 今天我们上C#课,前几天使用的Access数据库,现在要使用SQL Server2005了,老师让自己先安装,由于我来之前这个机子已经被人安装过了,但是没安装内容,我就全部卸载了,然后自己重装。但是重装的过程遇到了一些问题,导致SQL Server2005安装不上,出现了如下问题: 没有下一步。当然,上面出现的统计结果可能不同,我看到有14个的,还有15个的,一般都是1个Error,出现红叉就说明通不过,黄色叹号的没什么大碍。 点红叉后面的Message看看,提示如下: Performance Monitor Counter Requirement The System Configuration Check for Performance Monitor counter registry value has failed. For details, see How to: Increment the Counter Registry Key for Setup in SQL Server 2005, in the readme file or in SQL Server Books Online 我也没看懂,反复删除安装了若干遍之后,还是没有安装成功。 解决方法一: 在无奈中我把.NET Framwork2.0重新安装了一遍,修复了一下, 然后重新安装,就可以通过了! 我也不是很理解为什么,但是我身边的几个同学照我说的做了之后都安装成功了,所以,出现这种问题,解决的最好方法就是:重新.NET Framwork2.0 解决方法二: 在开始菜单中点“运行”,输入“regedit”进入注册表,找到HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Perflib,下面有004和009两项。双击004下面的Counter,在数值数据最底下倒数第二行的一个数字,记住这个数字。然后双击009下面的Counter,同样记住数值数据最底下倒数第二行的数字,然后点击Perflib下的Last Counter,改为十进制显示,将004和009下面的较大的数据写道这里面。同样的方法,把Help中较大的数值写道Last Help中,然后退出,重新安装即可。 关 键 字:SQL2005 1.数据和日志文件分开存放在不同磁盘上 数据文件和日志文件的操作会产生大量的I/O,在可能的条件下,日志文件应该存放在一个与数据和索引所在的数据文件不同的硬盘上以分散I/O,同时还有利于数据库的灾难恢复。 2.tempdb数据库单独存放在不同磁盘上 tempdb数据库是其他所有数据库都有可能使用的临时数据库。当使用select into、在没建立索引的列上执行Orderby时就会在tempdb数据库中产生临时表来存储中间数据。由于建立和填充临时表会严重降低系统性能,所以在尽可能的情况下应该为要排序的列建立索引。同时,tempdb数据库是为所有的用户和应用程序共享,所以如果一个用户占据了tempdb数据库的所有空间,则其他数据库将不能再使用。在可能的情况下,tempdb数据库应该单独放置在一个速度更快的硬盘或者RAID阵列上。分离tempdb数据库的I/O操作以加快性能。tempdb数据库应该有适当的容量,以满足用户的需要。应该允许tempdb数据库的空间自动增长。如果设置为不允许自动增长,当查询操作建立了超过tempdb数据库容量的临时表时,操作将无法完成。 适当设置tempdb数据库的增长幅度,过小的增长幅度会产生更多的外部碎片,会占用更多的资源。 3.避免热点数据的发生 在SQLServer7.0之前,对于没有聚集索引的表(堆集表),新插入的数据行总是放置在磁盘中表的物理结尾处。如果并发的用户很多,同时在对表执行插入或者更新数据的操作,这将使得十分繁忙的表的末尾有可能产生数据热点, 并发的I/O操作集中对少数页面进行操作,将导致数据库性能的下降。 在SQLServer中,新的数据行的物理存储空间的分配是通过PFS页面来进行的。PFS页面的管理算法将插入操作进行分散来尽量避免产生数据热点。 在设计应用系统和数据库时,要避免在自然增长的列上建立主键,这样有可能导致热点数据的发生。 4.数据类型要少 在设计表时,尽可能少用数据类型。这样一个数据页面上可以保存最多的信息。数据页面就少,检索数据页面的I/O操作就少,所以效率会高。 5.监控和整理空间碎片 文件空间的自动增长提高了自动管理性,但可能导致空间碎片。物理空间与数据的逻辑空间不再连续。定期的监控和空间碎片整理有利于提高I/O性能。 6.使用主数据文件和次要数据文件 每个数据库的一个主数据文件属于主文件组。对于1GB左右规模的数据库,一个数据文件就够了,如果有次要数据文件,主数据文件中有管理次要数据文件的指针。 采用多个数据文件时,主数据文件用于存储系统对象和表,次要数据文件用于存储用户数据和索引。在可能的情况下,主数据文件和次要数据文件可以单独存放在不同的磁盘上以分散I/O。 如果采用多个数据文件,推荐主数据文件存储系统数据,次要数据文件存放用户数据和索引,这样会有助于提高I/O性能。 sql server关键字一 从今天开始我们就讲讲SQL Server里面的一些关键字,这一部分我们分为9章,有的关键字会有详细的内容,有的就是很简单的说一下,因为那些真的太简单了。 1.add 用在alter tabel的时候,添加一个新字段, 如果这个字段已经添加,再次添加的时候,就会报错:Msg 2705, Level 16, State 4, Line 1 Column names in each table must be unique. Column name 'bookname' in table 'dbo.book' is specified more than once. 实例 alter table dbo.book add bookname varchar(20) not null go 2.all select 语句的一个选项, 用于select 列表中,和union 操作符和group 不用语句一起使用,all 选项指定重复值可以出现在结果集中。 在group 语句中,最好不要用 group by all。比较少见的是select * from table1 where c < all(select c from table2),也就是把表2查询的c作为一个集合,表1要查询值必须满足2的所有条件。 3.and 这是一个bool 操作符,用and连接的条件必须都是true的时候,这个检索条件才是真,多用于 join on,where后。 实例 select * from table where 字段1=? and 字段2=? select * from table1 t1 join table2 t2 on t1.c=t2.c and t1.c2=? 4. any 有all的类似用法,用于select的比较操作符,如果在条件中,有一个满足查询要求的就返回真,可以用上面的列子,把all 换成any。可以自己动手试试。 5.as 主要用来给字段或者表 取别名用。 别名的用处1:结果集的字段名称更加易读,2:同一张表在连接的时候,不同的别名,sql server读取表的时候不会混淆,3:使sql 语句更简洁。 6.asc 用在 order by后,按照某个字段进行升序排列 order by c asc 7.avg 取平均值,avg(c),c必须是数字型的字段名 8.backup 主要是用来备份数据库,事务日志或者文件组中的一个或多个文件。 BACKUP 计算机在操作过程中难免出现意外,为了保证用户数据的安全性,防止数据库中的数据意外丢失,应对数据库即时进行备份, BACKUP命令用于将数据库内容或其事务处理日志备份到存储介质上(软盘、硬盘或磁带等)。数据库备份语法: Backup Database database_name To < backup_device > [ With [ Differential ] [ [ , ] Format | Noformat ] [ [ , ] { Init | Noinit } ] < backup_device > ::= { { Disk | Tape } = 'physical_backup_device_name' } 参数说明: Backup Database:关键字。 database_name:备份的数据库名称。 To:关键字,用于指定备份设备。 Differential:指定数据库备份或文件备份应该与上一次完整备份后改变的数据库或文件部分保持一致。 Format:表示重写媒体头。 Noformat:表示指定媒体头不应写入所有用于该备份操作的卷中,并且不要重写该备份数据。 Init:表示重写所有备份集,但保留媒体头。 Noinit:表示备份集将追加到指定的磁盘或磁带设备上,以保留现有的备份集,该选项是默认设置。 示例: 把“student”数据库备份到名称是“backup.bak”的备份文件。 SQL语句如下: backup DATABASE student TO disk='backup.bak' 9.begin 在transaction sql 语句中,形如{}, 有begin 就有end。 10.between 多用于where 条件中,between and 相当于>= and <=。 11.break 多用于while中,和c# 或者JAVA中的break同意。 12.bulk 主要用于批量插入 14.by 和group ,order 等连用,group by,order by 15.cascade cascade 子句和deny一起使用,指定权限从一个用户账号决绝,以及由第一个用户账号授予权限的所有其他账户都被拒绝 16.case 多用于 select 和update。 case when then else end ★ InnoDBInsert(插入)操作(下)mysql技术内幕 ★ 五道常见面试题 ★ 计算机系毕业论文 【SQL?Server的七个问题及其解决办法(共10篇)】相关文章: 计算机毕业设计开题报告2023-12-29 php 面试题2022-06-12 Access数据处理方法论文2022-11-25 提高航空发动机性能的弯扭导向器技术2022-11-09 关于学籍管理系统论文开题报告2023-04-11 如何通过 SQL Server 使用 Forms 身份验证安全设置2023-03-26 数据库实训总结2024-01-27 ACCESS数据库中Field对象的caption属性读写数据库教程2023-06-16 校园网站设计方案2023-11-07 三大措施设置数据库安全 保障网站安全运营2023-04-11篇7:两款工具解决SQL Server迁移问题
篇8:如何解决SQL Server 2005无法重装问题SQL2005
Messages
篇9:浅谈如何优化SQL Server服务器
篇10:sql server关键字一