首页 > 编程技术 > php

打开UDP端口1434以浏览命名实例

发布时间:2016-11-25 16:40

:本地的一个ISP托管了我们的SQL Server,但是我不能看到或连接到运行在该计算机上的命名实例。我知道SQL Server 2000命名实例不使用TCP/IP 1433端口,并且确定该SQL Server实例所使用的TCP/IP端口是打开的。您有什么建议吗?
:许多人知道如何使用SQL Server网络实用工具或SQL Server错误日志来确定SQL Server实例的监听端口。但许多人似乎忘记或者根本不知道——UDP 1434端口也必须是打开的,以确保您能够正确地访问和浏览命名实例。我建议您仔细研究一下这一要求。在SQL Server在线书籍中搜索“1434”,您将得到三个颇有研究价值的搜索结果。在SQL Server杂志网站2001年7月刊我的SQL Server实用技巧专栏中,您还可以查找到有关访问命名实例的信息(InstantDoc ID 21127)。在此我也简单解释一下。SQL Server在UDP 1434端口上建立一个监听服务,让客户端从服务器上查询到命名实例及其网络配置信息的一个列表。该监听服务始终运行在UDP 1434端口上,并且用户无法更改该运行端口。
—Brian Moran


问:怎样在一个UPDATE语句中使用表B的三个列更新表A中的三个列?
答:对这个问题,您可以使用强大的关系代数。本页中的代码说明了如何组合使用FROM子句和JOIN操作,以达到用其他表中数据更新指定列的目的。在设计关系表达式时,您需要决定是否需要单一行匹配多个行(一对多关系),或者需要多个行匹配被联接表中的单一行以更新所有行(多对一关系)。
在一对多关系中,SQL Server始终使用它找到的最后一行更新数据。但是,您无法控制最后一行所在的位置。在多处理器的计算机上,查询可能是同步进行的,相同的查询最后一行的位置可能会不同。因此,Microsoft建议尽量不要使用一对多关系。
如果待更新的表与FROM子句中的表相同,并且FROM子句只包含对该表的一个引用,别名可能未被指定。如果待更新的表在FROM子句中出现了多次,只有该表的一个引用可以省略表的别名,对该表的所有其他引用必须包含一个表别名。
USE tempdb
GO
CREATE TABLE #t1 (c1 int NOT NULL, c2 char(5), c3 char(5),
c4 char(5))
GO
CREATE TABLE #t2 (c1 int NOT NULL, c2 char(5), c3 char(5),
c4 char(5))
GO
--数据赋值
INSERT #t1 values (1,'hello','there','fred')
INSERT #t2 values (1,'how','are','you?')
--更新数据
UPDATE #t1 SET #t1.c2 = #t2.c2, #t1.c3 = #t2.c3,
#t1.c4 = #t2.c4
FROM #t2
WHERE #t1.c1 = #t2.c1
--检查结果
SELECT * FROM #t1
—Microsoft SQL Server开发团队


问:怎样才能将XML文件导入SQL Server 2000?
答:将XML文件导入SQL Server有若干种方法,这里提供其中的3种:
大容量装载COM接口。如果需要将文档的实体和属性析取到关系表中,最快的方法就是使用SQL Server 2000 Extensible Markup Language 3.0 Service Pack 1(SQLXML 3.0 SP1)提供的大容量装载COM接口。大容量状态COM接口包含在SQLXML 3.0 SP1的免费下载中。
textcopy.exe命令行实用工具。如果不希望将文档的实体和属性析取到关系表中,您可以使用textcopy.exe命令行实用工具。Textcopy.exe是将文本和image数据类型从单一服务器行或列移入或移出的优秀工具。
数据转换服务(DTS)。如果XML文档很简单,您可以使用DTS将信息逐行析取到表中。这一方法要求您将XML文件定义为输入数据源,将数据库表定义为输出数据源,并编写ActiveX脚本剖析"<"和">"方式的字符输入,以析取实体、属性及其值。
 
—Microsoft SQL Server开发团队


问:我的一个表中包含了名为IdValue的单列主键。对于给定的IdValue值,我希望找到紧邻目标值之前和之后的表行(假定结果按IdValue排序)。怎样才能不使用游标而通过一个基于集合的方法得到需要的结果?
答:Transact-SQL是一个基于集合的语言,使用它在结果集中定位特定的行并非一件易事。但是,服务器端ANSI Transact-SQL游标的性能远远不如基于集合的解决方案,因此,学习解决问题的多种技术非常重要,尤其在面临上述问题时。
以Northwind数据库中的Orders表为例。我们可以这样重述该问题:怎样才能在Orders表中找到紧邻特定行之前和之后的行而不使用游标?假设我们按照OrderId列对结果集排序。
创造性地使用SQL Server的MIN()、MAX()和 TOP功能可以帮助您解决诸如此类的结果集定位问题。程序清单1和2给出了两个相似的、仅有细微差别的解决方法。程序清单1提供了一个常见的解决方案,因为它运用了@TargetOrder的MIN()和MAX()终点。但在某些情况下,展示TOP的灵活性也很有用。请注意,在以参数方式提供Orders表的最小OrderId(10248)时,程序清单2中的查询将返回空集,因为该查询假定在@TargetOrder行前总有一个行存在。
一般说来,生成结果集的方法不止一种,其中某一方法通常比其他的更高效。当您对这两个例子评估SHOWPLAN和SET STATISTICS IO信息时,您会发现运用了TOP语句的程序清单2的效率略微高于程序清单1。差别很细微的原因在于样本数据集很小,但在存在多种查询方法的情况下,测试不同方法的性能非常重要。
—Brian Moran
程序清单1:使用包含OR关键字的MIN() and MAX()函数查找目标行
DECLARE @TargetOrder int
SET @TargetOrder=10330
FROM Orders
WHERE OrderId=@TargetOrder
OR OrderId=(SELECT MAX(OrderId)
FROM orders WHERE OrderId < @TargetOrder)
OR OrderId = (SELECT MIN(OrderId)
FROM orders WHERE OrderId > @TargetOrder)
程序清单2:使用TOP关键字查找目标行
SELECT
TOP 3
*
FROM orders
WHERE OrderId >=(SELECT MAX(OrderId) FROM orders
WHERE OrderId < @TargetOrder)
ORDER BY
OrderId


问:我想以一次5,000行的方式批量更新一个大型表,但我不知道怎样分割数据。该表不包含增量数字或整数主键。怎样才能在保持良好性能的同时实现数据更新呢?
答:如果知道哪些行尚未被更新,您可以使用简单的谓词来排除已更新的行,ROWCOUNT设置可以帮助您批量分割数据。以下的代码清单说明了如何使用该设置:
SET ROWCOUNT 1000
WHILE (1=1) BEGIN
BEGIN TRANSACTION
UPDATE...set ...,MyLastUpdate='date',...WHERE
MyLastUpdate < 'date'
-- 更新1000未更新行
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
END
在指定的行数返回后,ROWCOUNT将使SQL Server停止查询处理。这项技术很有用,因为它避免了大量更新所致的并发命中;更新中的行数越少,更新任务使其他用户不能访问该数据的可能性就越小。结合事务日志备份,这一方法还可以使您的事务日志的大小降至最低。
如果没有识别已更新行的机制,您可以使用游标遍历所有数据并提交每个x值。但是,游标占用服务器资源的时间通常要多于基于集合的语句。
—Microsoft SQL Server开发团队


标签:[!--infotagslink--]

您可能感兴趣的文章: