SQL Server 技术问答

本文旨在通过一系列精心设计的问题和答案,帮助读者深入理解SQL Server数据库技术。这些问题覆盖了从基础到高级的多个方面,包括网络协议、数据类型、日期时间处理、聚合函数、SQLCLR、数据库快照以及TOP子句的使用。

问题1:基础入门

如果需要访问一个不在域内的SQL Server实例,并且只能使用TCP/IP网络协议,那么需要在防火墙上打开哪些端口?

正确答案是:取决于管理员的选择。1433是SQL Server默认实例的默认端口(由IANA分配)。在2000版本之前,一个端口就足够了,因为在一个服务器上只能运行一个SQL Server实例。但是从2000版本开始,可以有多个实例,因此管理员可以选择哪个端口被哪个实例使用。

端口1434(UDP)被SQL Server Browser服务使用。客户端可以使用此服务查询所有运行的SQL Server实例的连接信息(TCP/IP端口或命名管道)。如果知道要连接的实例使用的端口,那么根本不需要SQL Server Browser。因此,在这种情况下,不需要连接到端口1434。

问题2:数据类型

如果想跟踪每行数据最后一次写入访问(INSERT、UPDATE)的日期和时间,应该如何实现?

正确答案是:在表中添加一个DATETIME列,并编写一个触发器来设置其值。TIMESTAMP在这种情况下没有帮助,因为它不记录任何日期或时间值。它只是提供了一种生成唯一二进制数字的方法,每当行的内容发生变化时,这些数字就会变化。

如果只是想记录最后一次更改的日期和时间,以识别自某个时间点以来已更改的那些行(例如,对于数据仓库的增量加载),并且能够使用SQL Server 2008,那么可以查看更改跟踪和数据捕获。它们提供了一种机制,无需更改表结构即可实现。

问题3:日期和时间处理

以下语句的结果是什么:

SELECT CAST(FLOOR(CAST(@MyDateTime AS FLOAT)) AS DATETIME);

正确答案是:只有@MyDateTime的日期部分。如果将datetime值转换为float,会得到一个表示自1900年1月1日以来的天数的浮点值:

SELECT CAST(CAST('1900-01-01 00:00:00' AS DATETIME) AS FLOAT);

小数位代表时间:

SELECT CAST(CAST('1900-01-01 12:00:00' AS DATETIME) AS FLOAT);

上述语句将datetime变量转换为float,使用floor去除小数位,然后将结果转换回datetime。因此,它去除了datetime变量的时间部分。与SQL Server 2005相比,2008版本提供了单独的日期和时间数据类型。

问题4:聚合

以下语句在SQL Server 2005中是否有效?

SELECT CustomerKey, ProductKey, SUM(SalesAmount) AS SumSalesAmount, SUM(SalesAmount) / SUM(SUM(SalesAmount)) OVER (PARTITION BY CustomerKey) * 100 AS SumSumSalesAmount FROM dbo.FactInternetSales GROUP BY CustomerKey, ProductKey ORDER BY CustomerKey, ProductKey;

正确答案是:有效。可能知道over关键字来自排名函数。然而,不太为人所知的是,也可以将over与传统聚合函数一起使用。

示例生成了包括客户、产品和每个客户为每个产品产生的收入的销售统计。第四列计算了每个产品的收入与客户总收入的比例。

问题5:SQLCLR

在.NET Framework中,哪些类可以在设置为SAFE的SQLCLR程序集中使用?

正确答案是:有些类是专门为在SQL Server内部使用而测试的,可以使用。有一个硬编码的程序集列表,SQL Server从文件系统加载这些程序集。这些程序集经过了广泛的代码审查,以确保它们不会使SQL Server不稳定。

然而,有些程序集同时包含支持和不支持的功能(例如mscorlib)。在这些情况下,Microsoft引入了HostProtectionAttribute属性。不允许在SQL Server中使用的类型和成员都带有这个属性。

问题6:数据库快照

在最先进的四核服务器上使用RAID 5创建一个100GB数据库的快照大约需要多长时间?

正确答案是:几秒钟。数据库快照使用稀疏文件。这意味着在创建快照时不会复制数据库。在源数据库中的数据页被修改之前,数据页会被复制。这种机制称为写时复制。因此,创建数据库快照非常快。但是,当写入源数据库时,需要付出性能代价。

在SQL Server 2005中,可以在哪些语句中使用TOP子句?

正确答案是:SELECT、INSERT、UPDATE、DELETE。在SQL Server 2000中,TOP只支持SELECT语句。从SQL Server 2005开始,可以在INSERT、UPDATE和DELETE中使用TOP。

USE tempdb; CREATE TABLE Orders ( OrderId INT, CustId INT, Revenue MONEY); INSERT INTO Orders ( OrderId, CustId, Revenue ) SELECT 1, 1, 5000 UNION ALL SELECT 2, 1, 1000 UNION ALL SELECT 3, 2, 500 UNION ALL SELECT 4, 2, 100 UNION ALL SELECT 5, 3, 50 UNION ALL SELECT 6, 3, 10; WHILE EXISTS ( SELECT 1 FROM Orders WHERE CustId = 1 ) DELETE TOP (1) FROM Orders WHERE CustId = 1; SELECT * FROM Orders;
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485