2009年5月20日
#
DECLARE @html varchar(max),@sql nvarchar(max),@tablename varchar(200)
SET @tablename = 'member'
SET @html = '<table><tr>'
SET @sql = 'SET @html = '''';';
SET @sql = @sql + 'SELECT TOP 10 @html = @html + ''<tr>'','
/* 表头 */
SELECT
@html = @html + '<th>'+c.name+'</th>',
@sql = @sql + '@html = @html + ''<td>''+ CAST('+c.name+' AS varchar) + ''</td>'', '
FROM sys.columns AS c
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id
WHERE EXISTS
(
SELECT * FROM sys.tables
WHERE name = @tablename
AND c.object_id = object_id
)
SET @sql = @sql + '@html = @html + ''</tr>'''
SET @sql = @sql + ' FROM '+@tablename+';'
DECLARE @out varchar(max)
exec sp_executesql @sql,N'@html varchar(max) output',@out output
SET @html = @html + @out
SET @html = @html + '</tr>'
SET @html = @html + '</table>'
SELECT @html
2009年4月6日
#
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
(function(){
$("#play_list").css("opacity","0.3"); //设置透明度
$("#play_list").children().clone().appendTo("#selector"); //复制元素
$("#selector").css({
left:$("#play_list").offset().left,
top:$("#play_list").offset().top
}); //定位选择器
$("#selector").scrollLeft(0); //回到第一帧
})();
var $intervalID = null
$("#play_list a").mouseover(function(){
clearInterval();
var $move = $(this).offset().left - $(this).parent().offset().left; //目标滑动位置
var $left = $("#play_list").offset().left + $move; //目标左边距位置
var $m =$("#selector").scrollLeft(); //现滑动位置
var $l = parseInt($("#selector").css("left")); //现左边距位置
var $direct = ($l < $left)?1:-1; //滑动方向
var $multiple = ($left - $l ) *$direct / 12; //倍数
$intervalID = window.setInterval(function(){
$l+=$multiple*$direct;
$m+=$multiple*$direct;
if($l *$direct < $left*$direct){
$("#selector").css("left",$l).scrollLeft($m);
}else{
$("#selector").css("left",$left).scrollLeft($move);
clearInterval();
}
}, 1);
});
//清除前面的动画效果
function clearInterval(){
if($intervalID != null){
window.clearInterval($intervalID);
$intervalID = null;
}
}
})
</script>
<style>
a{text-decoration: none;}
#selector img,#play_list img{width:120px; border:1px; }
</style>
</head>
<body>
<div id="selector" style="overflow:hidden; width:120px;white-space:nowrap; position:absolute;Z-index:100"></div>
<br><br><br><br><br><br>
<div id="play_list">
<a href="http://koyoz.com/1.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/1.jpg" alt="相恋9年尔冬升再婚娶相恋9年女友" />
</a>
<a href="http://koyoz.com/2.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/2.jpg" alt="恋情变贤周海媚公开6年恋情变贤妇" />
</a>
<a href="http://koyoz.com/3.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/3.jpg" alt="为啥这么“熊猫”阿宝为啥这么红?" />
</a>
<a href="http://koyoz.com/4.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/4.jpg" alt="男友被捕安妮-海瑟薇前男友被捕" />
</a>
<a href="http://koyoz.com/5.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/5.jpg" alt="开价一亿天后王菲“复出”开价一亿" />
</a>
<a href="http://koyoz.com/6.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/6.jpg" alt="赞郑伊健阿Sa赞郑伊健“保存”得好" />
</a>
<a href="http://koyoz.com/7.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/7.jpg" alt="死跑龙套北影演员:甘当‘死跑龙套的’" />
</a>
<a href="http://koyoz.com/8.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/8.jpg" alt="潘玮柏死潘玮柏死盯辣妹脱衣解带" />
</a>
<a href="http://koyoz.com/9.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/9.jpg" alt="张曼玉分尔冬升深爱张曼玉分手发呆" />
</a>
</div>
</body>
</html>
2009年4月4日
#
只能用鼠标而不是用手哟。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<style>
img{border:0px; cursor:pointer;}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var $mouseX = 0; //鼠标X轴坐标
var $scrollLeft = 0; //滑动位置标记
var $width = 0;
//初始化
(function init(){
$("#play_list").scrollLeft($scrollLeft); //回到第一帧
$("#play_list a").click(function(){return false;}) //取消所有click
})();
//开始工作,记录鼠标位置
$("#play_list img").mousedown(function(e){$mouseX = e.pageX;return false; });
$("#play_list img").mouseup(function(e){
if($mouseX > 0){
var $move = $mouseX-e.pageX;//滑动偏移量
//点击处理
if($move==0){
window.location = $(this).parent().attr("href");
return false;
}
$mouseX = 0;$width = 0; //还原设置值
$(this).parent().prevAll().each(function() {$width += $(this).width(); }); //前面元素宽度累加
$scrollLeft = $width+$(this).width() * (($move > 0)?1:-1); //1为向左滑动 -1这向右滑动
$("#play_list").animate({ scrollLeft: $scrollLeft },500); //设置滑动位置及动画效果
}
return false;
});
//图片跟随鼠标滑动
$("#play_list img").mousemove(function(e){
if($mouseX > 0){
var $move = $scrollLeft + $mouseX-e.pageX;
$("#play_list").scrollLeft($move);
}
return false;
});
});
</script>
</head>
<body>
<div id="play_list" style="overflow:hidden; width:341px; height:191px; white-space:nowrap;">
<a href="http://koyoz.com/1.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/1.jpg" alt="相恋9年尔冬升再婚娶相恋9年女友" />
</a>
<a href="http://koyoz.com/2.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/2.jpg" alt="恋情变贤周海媚公开6年恋情变贤妇" />
</a>
<a href="http://koyoz.com/3.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/3.jpg" alt="为啥这么“熊猫”阿宝为啥这么红?" />
</a>
<a href="http://koyoz.com/4.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/4.jpg" alt="男友被捕安妮-海瑟薇前男友被捕" />
</a>
<a href="http://koyoz.com/5.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/5.jpg" alt="开价一亿天后王菲“复出”开价一亿" />
</a>
<a href="http://koyoz.com/6.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/6.jpg" alt="赞郑伊健阿Sa赞郑伊健“保存”得好" />
</a>
<a href="http://koyoz.com/7.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/7.jpg" alt="死跑龙套北影演员:甘当‘死跑龙套的’" />
</a>
<a href="http://koyoz.com/8.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/8.jpg" alt="潘玮柏死潘玮柏死盯辣妹脱衣解带" />
</a>
<a href="http://koyoz.com/9.jpg">
<img src="http://www.koyoz.com/demo/html/autoplay_xunlei/imgs/9.jpg" alt="张曼玉分尔冬升深爱张曼玉分手发呆" />
</a>
</div>
</body>
</html>
2009年2月5日
#
64位的操作系统(包括xp,2003,vista,2008等)在使用OLEDB去访问时回收到下面的一个错误
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine
问题出在'Microsoft.Jet.OLEDB.4.0' 没有64位的版本。微软好像也不准备出一个64位的版本。
下面是一些目前能采取的解决办法
如果不是WebSite那么你可以采取指定编译的办法
http://cajon.cnblogs.com/archive/2006/05/30/413408.html
如果是WebSite且是IIS6
键入以下命令启用 32 位模式:
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1
如果是IIS7
appcmd list apppool /xml | appcmd set apppool /in /enable32BitAppOnWin64:true
最后强烈要求微软出‘Microsoft.Jet.OLEDB.4.0' 64位版本!
2009年1月28日
#
2008年12月1日
#
刚刚将一台服务器升级到IIS7,经典模式没有任何问题。换成集成模式碰到以下问题
问题一:
状况:程序启动报“Request is not available in this context”错误。
原因:在集成模式下Application_Start时HttpContext并不可用。
解决:在Application_BeginRequest中使用单件模式模拟Application_Start。
具体参阅
http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx问题二:
状况:IIRF会造成连接池自动关闭
原因:不详
解决:使用URL Rewrite Module代替IIRF
问题三
状况:QueryString中如果使用中文,接收回来是乱码
原因:可能是微软的bug
解决:用Server.UrlEncode对参数进行编码。
参阅
http://forums.iis.net/p/1148476/1865705.aspx
2008年8月1日
#
原理参见
http://www.cnblogs.com/xbf321/archive/2007/11/09/954317.html
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>File Upload</title>
<script type="text/javascript" src="js/jquery-1.2.6.js"></script>
<script type="text/javascript">
$(document).ready(function(){
if(window.top == window)
{
var $div = $(document.createElement("div"));
$div.html("<iframe src='"+document.URL+"' name='uploadiframe' id='uploadiframe'></iframe>");
$div.css({display:"none"})
$("body").append($div);
$("form").attr("target","uploadiframe");
$("form").submit();
$(".myupload").empty();
var $a = $(document.createElement("a"));
$($a).html("upload");
$($a).click(function(){
$("#uploadiframe").contents().find(":file").click();
$("#uploadiframe").contents().find(":submit").click();
return false;
});
$(".myupload").append($a);
}
});
</script>
<script type="text/C#" runat="server">
protected void File_Upload(object sender, EventArgs e)
{
if (FileUploadControl.HasFile == true)
{
FileUploadControl.SaveAs(@"D:\upload\" + FileUploadControl.FileName);
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div class="myupload">
<asp:FileUpload ID="FileUploadControl" runat="server" />
<asp:Button runat="server" OnClick="File_Upload" Text="Upload It" />
</div>
</form>
</body>
</html>
2008年6月12日
#
2008年5月23日
#
2008年4月18日
#
DECLARE @databasedir varchar(200)
SET @databasedir = 'F:\SQLServer\Data\'
/* 目录结构 */
DECLARE @t table(id int identity(1,1),subdirectory nvarchar(255),depth int,i int)
INSERT INTO @t(subdirectory,depth,i)
EXEC master..xp_dirtree @databasedir,0,1
DELETE FROM @t WHERE subdirectory NOT LIKE '%.mdf'
DECLARE @filename nvarchar(255),@dbname nvarchar(255),@filename1 nvarchar(255),@subdirectory nvarchar(255)
DECLARE @cmd nvarchar(4000)
create table #smoPrimaryFileProp(property sql_variant NULL, value sql_variant NULL)
WHILE (SELECT COUNT(*) FROM @t) > 0
BEGIN
SELECT TOP 1 @subdirectory = subdirectory FROM @t
SELECT @fileName = @databasedir+@subdirectory;
BEGIN TRY
SET @cmd = 'dbcc checkprimaryfile (N'''+ @fileName + ''' , 2)'
TRUNCATE TABLE #smoPrimaryFileProp
insert #smoPrimaryFileProp exec (@cmd)
SELECT @dbname = CAST([value] AS nvarchar(255))
FROM #smoPrimaryFileProp WHERE [property] = 'Database name'
SELECT @filename1 = REPLACE(@fileName,'.mdf','_log.LDF');
EXEC sp_attach_db
@dbname,
@fileName,@filename1
END TRY
BEGIN CATCH
END CATCH
DELETE FROM @t WHERE subdirectory = @subdirectory
END
DROP TABLE #smoPrimaryFileProp
2008年4月11日
#
Windows Vista具有一个上下文菜单选项,叫做“拷贝为路径”,它可以帮助你轻松拷贝文件路径,尽管它是隐藏的。当你选中文件后,你只需要按住“Shift”键同时右键点击,即可拷贝路径。该选项对于多个文件和文件夹也同样适用。当你使用“拷贝为路径”选项对多个项目进行操作时,所有路径都会被解析、引用,并且被以多行的方式记录在剪贴板里。
2008年2月22日
#
DECLARE @t TABLE(student nvarchar(50),class nvarchar(50),grade int)
/*insert some datas*/
INSERT INTO @t
SELECT N'孙小美',N'数学',10 UNION ALL
SELECT N'孙小美',N'语文',20 UNION ALL
SELECT N'孙小美',N'英语',30 UNION ALL
SELECT N'阿土伯',N'数学',40 UNION ALL
SELECT N'阿土伯',N'语文',50 UNION ALL
SELECT N'阿土伯',N'英语',60 UNION ALL
SELECT N'小叮铛',N'数学',70 UNION ALL
SELECT N'小叮铛',N'语文',80 UNION ALL
SELECT N'小叮铛',N'英语',90
SELECT * FROM
(
SELECT
ISNULL(student,'ALL') AS student,
ISNULL(class,'ALL') AS class,
SUM(grade) AS grade
FROM @t
GROUP BY GROUPING SETS((student,class),student,class,())
) AS t
PIVOT
(
MAX(grade) FOR class IN (数学,语文,英语,[ALL])
) AS p
ORDER BY student DESC
SQL Server 2008可以执行TSQL的MERGE命令。用MERGE命令,只需一个语句就可以对行进行 UPDATE、INSERT或 DELETE。
DECLARE @t1 table(t varchar(max))
DECLARE @t2 table(t varchar(max))
INSERT INTO @t1
SELECT 'a' UNION ALL
SELECT 'b' UNION ALL
SELECT 'c'
INSERT INTO @t2
SELECT 'b' UNION ALL
SELECT 'c' UNION ALL
SELECT 'd'
MERGE @t1 AS t1
USING (SELECT t FROM @t2) AS t2
ON t1.t = t2.t
--WHEN MATCHED THEN
WHEN NOT MATCHED THEN
INSERT (t) VALUES(t);
SELECT * FROM @t1
2007年12月28日
#
SELECT t.name,p.rows FROM sys.indexes AS i
INNER JOIN sys.tables AS t ON i.object_id = t.object_id
join sys.partitions p with(nolock) on i.object_id = p.object_id AND i.index_id = p.index_id
WHERE i.type_desc = 'CLUSTERED'
ORDER BY p.rows
2007年12月3日
#
DECLARE @t table
(
spid int
)
INSERT INTO @t
SELECT spid FROM sys.sysprocesses AS p
WHERE EXISTS
(
SELECT * FROM sys.databases
WHERE name = 'ednchina20071202'
AND p.dbid = database_id
)
DECLARE @spid int
DECLARE @sql nvarchar(max)
WHILE((SELECT COUNT(*) FROM @t) > 0)
BEGIN
SELECT TOP 1 @spid=spid FROM @t
SET @sql = 'kill ' + CAST(@spid AS varchar(100))
EXEC sp_executesql @sql
DELETE FROM @t WHERE spid = @spid
END
GO
EXEC sp_dboption 'old','single user','true'
GO
EXEC sp_renamedb 'old','new'
GO
EXEC sp_dboption 'new','single user','false'
GO
2007年11月13日
#
SQL Server 2000
你可以在企业管理器中增加字段说明,也可以使用下面的代码:
EXEC sp_addextendedproperty
'MS_Description',
'some description',
'user',
dbo,
'table',
table_name,
'column',
column_name
现在,你就可以得到通过下面的代码得到字段说明:
SELECT
[Table Name] = i_s.TABLE_NAME,
[Column Name] = i_s.COLUMN_NAME,
[Description] = s.value
FROM
INFORMATION_SCHEMA.COLUMNS i_s
LEFT OUTER JOIN
sysproperties s
ON
s.id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME)
AND s.smallid = i_s.ORDINAL_POSITION
AND s.name = 'MS_Description'
WHERE
OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0
-- AND i_s.TABLE_NAME = 'table_name'
ORDER BY
i_s.TABLE_NAME, i_s.ORDINAL_POSITION
如果你只关心某一张表,那么上面的TSQL中的注释部份对你就非常有帮助。反过来就会给你所有表中的所有字段。
如果你只需要所有有说明的表,你可以把out join 改成 inner join
SELECT
[Table Name] = i_s.TABLE_NAME,
[Column Name] = i_s.COLUMN_NAME,
[Description] = s.value
FROM
INFORMATION_SCHEMA.COLUMNS i_s
INNER JOIN
sysproperties s
ON
s.id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME)
AND s.smallid = i_s.ORDINAL_POSITION
AND s.name = 'MS_Description'
WHERE
OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0
ORDER BY
i_s.TABLE_NAME, i_s.ORDINAL_POSITION
SQL Server 2005
在SQL Server 2005 中 sysproperties 表已被废弃,所以上面的代码都不能用。幸运的是他们还是增加了一个系统表给我们 sys.extended_properties,这张表和 sysproperties基本上相似。
SELECT
[Table Name] = OBJECT_NAME(c.object_id),
[Column Name] = c.name,
[Description] = ex.value
FROM
sys.columns c
LEFT OUTER JOIN
sys.extended_properties ex
ON
ex.major_id = c.object_id
AND ex.minor_id = c.column_id
AND ex.name = 'MS_Description'
WHERE
OBJECTPROPERTY(c.object_id, 'IsMsShipped')=0
-- AND OBJECT_NAME(c.object_id) = 'your_table'
ORDER
BY OBJECT_NAME(c.object_id), c.column_id
和SQL Server 2000一样,你可以使用注释部份来返回某一张表。
Microsoft Access
在Access中,你可以使用下面的ASP代码来得到某一个字段的说明
<%
on error resume next
Set Catalog = CreateObject("ADOX.Catalog")
Catalog.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=<path>\<file>.mdb"
dsc = Catalog.Tables("table_name").Columns("column_name").Properties("Description").Value
if err.number <> 0 then
Response.Write "<" & err.description & ">"
else
Response.Write "Description = " & dsc
end if
Set Catalog = nothing
%>
2007年7月20日
#
摘要: SELECT *的效率很糟糕吗?当然,所有人都知道这一点,但是为什么呢?
是因为返回了太多的数据?
这是一个普遍的回答,但我不这样认为。
阅读全文
2006年1月12日
#
2006年1月8日
#
通过“添加删除程序”里并不能完全删除SQlL server。
通过下面的命令,完全反安装SQL server 2005
d:\Setup.exe /qb REMOVE=ALL INSTANCENAME=<InstanceName> 默认实例的名字是MSSQLSERVER
2005年12月29日
#
min-width是个非常方便的CSS命令,它可以指定元素最小也不能小于某个宽度,这样就能保证排版一直正确。但IE不认得,所以如果你用IE将博客园的窗口宽度缩到足够小,所有的字都变在一列中。
常见的解决方法就是用javascript或IE的expressions。
在这里我来尝试用css来解决这个问题
假设我们需要一个min-width为300px的div
第一步
<div style="border-left: 300px solid #fff;height:1px"></div>
将左边框设为300px,并且边框的颜色和页面的背景色一样,高度设为1,否则这个div就看不见了
第二步
在上面的div中,加入下面的代码
<div style="margin-left: -300px;position: relative; height:1px;"></div>
定位方式设为 relative(对象不可层叠),并把对象margin-left(左边的外补丁)设为-300px。
这样这个div就会回到原点,而不是从300px开始,
分析
因为border-left为300px,所以div最小也得有300px,间接实现了min-width的功能。
而由于margin-left为-300px且position:为relative,所以里面的文字不受border-left的影响
完整的代码如下
<div style="border: 1px solid red; width: 90%;">
<div style="border-left: 300px solid #fff;height:1px;">
<div style="margin-left: -300px;position: relative; height:1px;">
宽度 90%, 最小宽度 300px;
最小高度 300%
</div>
</div>
</div>
2005年12月19日
#
使用 FILE_NAME 函数可以返回给定文件标识 (ID) 号的逻辑文件名
如下
下例返回 file_ID 为 1 的文件名(master 数据库文件)。
USE master
SELECT FILE_NAME(1)
当我们进行从一个备份中还原数据库时,数据库的逻辑文件名是不会改变的。
可用 ALTER DATABASE 的 MODIFY FILE 子句作为替代方式更改数据文件或日志文件的逻辑名称。
alter database 数据库名
modify file (
name=逻辑名
,newname=新逻辑名
)
事实上,上面的语句是更改了sysfiles和sysfiles1系统表中的name字段
2005年11月16日
#
<script language="JavaScript">
<!--
if (window.Event)
document.captureEvents(Event.MOUSEUP);
function nocontextmenu()
{
event.cancelBubble = true
event.returnValue = false;
return false;
}
function norightclick(e)
{
if (window.Event)
{
if (e.which == 2 || e.which == 3)
return false;
}
else
if (event.button == 2 || event.button == 3)
{
event.cancelBubble = true
event.returnValue = false;
return false;
}
}
document.oncontextmenu = nocontextmenu; // for IE5+
document.onmousedown = norightclick; // for all others
//-->
</script>
2005年11月7日
#
先来个例子
SELECT
YEAR(BirthDate),
ROW_NUMBER() OVER(ORDER BY YEAR(BirthDate)) AS 'RowNumber',/* 按年产生一个唯一的序号 */
ROW_NUMBER() OVER(PARTITION BY YEAR(BirthDate) ORDER BY BirthDate) AS RowNumberPartition, /* 每年产生一个唯一的序列 */
RANK() OVER(ORDER BY YEAR(BirthDate)) AS 'Rank', /* 产生一个非紧密排名 */
DENSE_RANK() OVER(ORDER BY YEAR(BirthDate)) AS 'Dense_Rank', /* 产生一个紧密排名 */
NTILE(10) OVER(ORDER BY BirthDate DESC) AS 'ntile' /* 将结果分成10个组 */
FROM HumanResources.Employee
ORDER BY BirthDate
看看新的排序函数如何解决SQL server 2000中不方便解决的问题
--按BirthDate排序,取第10条到20条的数据 (这一定是最激动人心的新特性,哈哈)
SELECT BirthDate FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY BirthDate) AS a,BirthDate
FROM HumanResources.Employee
) AS a
WHERE a BETWEEN 10 AND 20
--将数据分成十份,取第三份
SELECT
BirthDate
FROM
(
SELECT
NTILE(10) OVER(ORDER BY BirthDate DESC) AS a,BirthDate
FROM HumanResources.Employee
) AS a
WHERE a = 3
再来看看如何用新的排序函数解决以前在SQL server 2000中的问题
-- 出生的员工最多的一年出生多少员工(有点)
/* SQL server 2000 */
SELECT MAX(a)
FROM
(
SELECT COUNT(EmployeeID) AS a FROM HumanResources.Employee GROUP BY YEAR(BirthDate)
) AS a
/* SQL server 2005 */
SELECT MAX(a)
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY YEAR(BirthDate) ORDER BY BirthDate) AS a
FROM HumanResources.Employee
) AS a
-- 出生日期涵盖了多少年
/* SQL server 2000 */
SELECT COUNT(DISTINCT YEAR(BirthDate)) FROM HumanResources.Employee
/* SQL server 2005 */
SELECT MAX(a)
FROM
(
SELECT
DENSE_RANK() OVER(ORDER BY YEAR(BirthDate)) AS a
FROM HumanResources.Employee
) AS a
-- 显示前10%的数据
/* SQL server 2000 */
SELECT TOP 10 Percent BirthDate FROM HumanResources.Employee
/* SQL server 2005 */
SELECT
BirthDate
FROM
(
SELECT
NTILE(10) OVER(ORDER BY BirthDate DESC) AS a,BirthDate
FROM HumanResources.Employee
) AS a
WHERE a = 1
你还能想出什么用处呢?
在SQL server 2005中一个新的特性——分区表。
建立分区表的步骤:
1 创建数据库(必须在多个文件组中)
2 创建分区函数
3 创建分区Scheme
4 创建分区表
USE master;
GO
IF OBJECT_ID (N'PartitionDataBase') IS NOT NULL
DROP DATABASE PartitionDataBase;
GO
/* CREATE DATABASE */
CREATE DATABASE PartitionDataBase
ON PRIMARY
(
NAME = N'File_A_H',FileName = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\PartitionDataBase_AH.mdf'
),
FILEGROUP FileGroup_I_N
(
NAME = N'File_I_N',FileName = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\PartitionDataBase_IN.mdf'
),
FILEGROUP FileGorup_M_Z
(
NAME = N'File_M_Z',FileName = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\PartitionDataBase_MZ.mdf'
)
GO
USE PartitionDataBase;
GO
/* 创建分区函数 */
CREATE PARTITION FUNCTION StaffNameRangePFN(varchar(100))
AS
RANGE LEFT FOR VALUES ('H','M')
GO
/* 创建分区Scheme */
CREATE PARTITION SCHEME StaffNamePScheme
AS
PARTITION StaffNameRangePFN
TO ([PRIMARY], FileGroup_I_N, FileGorup_M_Z)
GO
IF OBJECT_ID (N'Staff') IS NOT NULL
DROP TABLE dbo.Staff;
/* 创建分区表 */
CREATE TABLE [dbo].[Staff]
(
[StaffName] [varchar](100) NOT NULL
)
ON StaffNamePScheme ([StaffName])
GO
CREATE CLUSTERED INDEX IX_StaffName ON [Staff]([StaffName])
GO
下面的代码将Staff表按StaffName分布到三个分区中。
插入一些测试数据
INSERT INTO [dbo].[Staff]
SELECT FirstName FROM AdventureWorks.Person.Contact
运行下面的代码,看看数据的分布情况
SELECT
$partition.StaffNameRangePFN(StaffName) AS [Partition Number],
MIN(StaffName) AS [Min StaffName],
MAX(StaffName) AS [Max StaffName],
COUNT(StaffName) AS [Rows In Partition]
FROM dbo.staff AS o
GROUP BY $partition.StaffNameRangePFN(StaffName)
ORDER BY [Partition Number]
看起来还不错。三个分区都差不多的数据
我们来打破这个平衡
INSERT INTO [dbo].[Staff]
SELECT AddressLine1 FROM AdventureWorks.Person.Address
修改分区表的步骤:
1 添加一个文件组到数据库
2 修改分区Scheme
3 修改分区函数
Use master
GO
ALTER DATABASE PartitionDataBase ADD FILEGROUP FileGroup_0_9
GO
ALTER DATABASE PartitionDataBase
ADD FILE
(
NAME = N'File_0_9',FileName = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\PartitionDataBase_09.mdf'
)
TO FILEGROUP FileGroup_0_9
GO
Use PartitionDataBase
GO
ALTER PARTITION SCHEME StaffNamePScheme
NEXT USED FileGroup_0_9;
GO
ALTER PARTITION FUNCTION StaffNameRangePFN()
SPLIT RANGE ('A');
GO
请注意修改和创建之间的一些差别
再用上面的代码看看数据分布的情况。
2005年10月18日
#
你可能已经注意到在asp.net 2.0 Beta1中的 Precompile.axd 和 Webadmin.axd 在asp.net 2.0 Beta2中已经找不到了.
如果你现在想要编译你的站点,你只能在命令行中使用aspnet_compiler或者是 Visual Studio's菜单中的 Build->Publish command。另一个Webadmin.axd, 我想你应该忘记它。Web的站点管理工具现在只能从Visual Studio中访问。
Precompile.axd 和 Webadmin.axd 对于开发人员来说实在是非常方便的工具,但是对于IT Pro来说可能是一场噩梦。我想ASP.Net team已经认识到了这一点,做出了这个决定。