:本地的一个ISP托管了我们的SQL Server,但是我不能看到或连接到运行在该计算机上的命名实例。我知道SQL Server 2000命名实例不使用TCP/IP 1433端口,并且确定该SQL Server实例所使用的TCP/IP端口是打开的。您有什么建议吗?
将XML文件导入SQL Server 2000
问:怎样才能将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开发团队
维护Sql Server中表的索引
--第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100%
declare @table_id int
set @table_id=object_id('表名')
dbcc showcontig(@table_id)
--第二步:重构表索引
dbcc dbreindex('表名',pk_索引名,100)
--重做第一步,如发现扫描密度/Scan Density还是小于100%则重构表的所有索引
--杨铮:并不一定能达100%。
dbcc dbreindex('表名','',100)
在PHP中操作MySQL要注意哪些问题
1、分号的例外
在MySQL中,每一行命令都是用分号(;)作为结束的,但是当一行MySQL命令被插入在PHP代码中时,最好把后面的分号省略掉,例如:
mysql_query ("INSERT INTO tablename (first_name, last_name) VALUES ('$first_name', '$last_name')");
这是因为PHP也是以分号作为一行的结束的,额外的分号有时会导致PHP 的语法分析器做出错误的分析,所以还是省略掉的好。在这种情况下,虽然省略了分号,但是 PHP 在执行 MySQL 命令时会自动加上分号。
另外还有一个不要加分号的情况。当你想把要字段的竖着排列显示下来,而不是像通常的那样横着排列时,你可以用 G 来结束一行SQL 语句,这时就用不上分号了,例如:
SELECT * FROM PENPALS WHERE USER_ID = 1G
2、TEXT、DATE、和 SET 数据类型
TEXT 不是一种数据类型,应该是" LONG VARCHAR "或者" MEDIUMTEXT "。
DATE 数据类型的格式是 YYYY-MM-DD ,比如: 2001-10-01 。你可以很轻易的用 date 函数来得到这种格式的当前系统时间:
date("Y-m-d")
并且,在 DATA 数据类型之间可以作减法,得到相差的时间天数:
$age = ($current_date - $birthdate);
集合 SET 是一个有用的数据类型,它和枚举 ENUM 有点相似,只不过是 SET 能够保存多个值而 ENUM 只能保存一个值而已。而且, SET 类型最多只能够有 64 个预定的值,而 ENUM 类型却能够处理最多 65,535 个预定义的值。而假如需要有大于 64 个值的集合,该怎么办呢?这时就需要定义多个集合来一起解决这个问题了。
3、通配符
SQL 的通配符有两种:" * "和" % "。分别用在不同的情况下。例如:假如你想看到数据库的所有内容,可以像这样来查询:
SELECT * FROM dbname WHERE USER_ID LIKE '%';
这儿,两个通配符都被用上了。他们表示相同的意思 ?? 都是用来匹配任何的字符串,但是他们用在不同的上下文中。" * "用来匹配字段名,而" % "用来匹配字段值。另外一个不轻易引起注重的地方是" % "通配符需要和 LIKE 要害字一起使用。
还有一个通配符,就是下划线" _ ",它代表的意思和上面不同,是用来匹配任何单个的字符的。
4、NOT NULL 和空记录
假如用户在没有填任何东西的情况下按了 submit 按钮,会怎样呢?假如你确实需要一个值,那么可以用客户端脚本或者服务器端脚本来进行数据验证,这一点在前面已经说过了。但是,在数据库中却是答应一些字段被空出来什么也不填。对此类纪录, MySQL 将进行以下步骤:
插入值 NULL ,这是缺省的操作。
假如你在字段定义中为之声明了 NOT NULL (在建立或者修改这个字段的时候), MySQL 将把这个字段空出来什么东西也不填。
对于一个 ENUM 枚举类型的字段,假如你为之声明了 NOT NULL , MySQL 将把枚举集的第一个值插入到字段中。也就是说, MySQL 把枚举集的第一个值作为这个枚举类型的缺省值。
一个值为 NULL 的纪录和一个空纪录是有一些区别的。 % 通配符可以匹配空纪录,但是却不能匹配 NULL 纪录。在某些时候,这种区别会造成一些意想不到的后果。就经验而言,任何字段都应该声明为 NOT NULL 。这样下面的 SELECT 查询语句就能够正常运转了:
if (!$CITY) {$CITY = "%";}
$selectresult = mysql_query ("SELECT * FROM dbname
WHERE FIRST_NAME = ' Bill '
AND LAST_NAME = ' Gates '
AND CITY LIKE '$CITY'
");
在第一行中,假如用户没有指定一个 CITY 值,那么就会用通配符 % 来代入 CITY 变量,这样搜索时就会把任何的 CITY 值都考虑进去,甚至包括那些 CITY 字段为空的纪录。
但是假如有一些纪录,它的 CITY 字段值是 NULL ,这时问题就出现了。上面的查询是不能够找到这些字段的。问题的一个解决办法可以是这样:
if (!$CITY) {$CITY = "%";}
$selectresult = mysql_query ("SELECT * FROM dbname
WHERE FIRST_NAME = ' Bill '
AND LAST_NAME = ' Gates '
AND (CITY LIKE '$CITY' OR CITY IS NULL)
");
注重在搜索 NULL 时,必须用" IS "要害字,而 LIKE 时不会正常工作的。
在最后要提到的是,假如你在加入或者修改一个新的字段之前,数据库中已经有了一些记录了,这时新加入的字段在原来的纪录中的值,可能是 NULL ,也可能为空,在这种情况下,使用 SELECT 查询要非凡的小心。
将列更新从一个表传递到另一个表
问:怎样在一个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开发团队
使用视图控制用户对数据访问
问:我的Microsoft Access 2000应用程序由后端的SQL Server 2000数据库写入数据。为防止Access的用户看到SQL Server 2000表中的全部数据,我想使用一种只允许用户浏览授权数据行的视图。可以创建一种限制用户访问SQL Server数据的视图吗?
答:可以。如果每位用户以唯一的用户ID登录到Access,您就可以创建一种限制用户访问SQL Server数据的视图。以下的示例语句就可以创建这样一种视图:
CREATE VIEW v_data AS
SELECT <column_list>
FROM dbo.mytable AS a
INNER JOIN dbo.authtable AS b
ON (a.Pkey = b.DataKey
AND b.userid = suser_sname())
该视图按userid限制用户的访问权。它要求您保存一份与数据表(mytable)中特定主键相匹配的用户名的表(authtable)。如果您的情况相对比较简单——您无需管理多个用户的行访问权,则您可以将userid列插入到数据表中,如下列代码所示:
CREATE VIEW v_data AS
SELECT <column_list>
FROM dbo.mytable AS a
WHERE a.userid = suser_sname()
—Microsoft SQL Server 开发团队
解决SQL Server 2000之日志传送功能
一、残余数据
当您进行SQL Server 2000日志传送的实验时,也许偶而会中断设定过程。如果真是如此,那么某些资料仍然会存入每台服务器的日志传送资料表,并且影响到后续的日志传送设定动作。为了保证这些剩余资料都会被清除,请确实删除每台服务器msdb数据库内日志传送资料表之相关资料。
错误信息:
Error 14261: The specified primary_server_name.primary_database_name ('N') already exists.
Error 14426: A log shipping monitor is already defined (...)
处理方法:
必须手动执行下面几个存储过程来删除Log Shipping在数据库中记录的信息。
1、sp_delete_log_shipping_primary
删除msdb.dbo.log_shipping_primary表中的Primary Server信息
2、sp_delete_log_shipping_plan
删除Log Shipping计划
3、sp_delete_log_shipping_secondary
删除msdb.dbo.log_shipping_secondaries表中的Secondary Server信息
4、sp_remove_log_shipping_monitor
删除Log Shipping监视从表msdb.dbo.log_shipping_monitor
二、数据库的模式
如果正确设置了Log Shipping,但是没有办法正常执行,在SQL Server的日志中可以看到类似这个信息和界面:
Microsoft (R) SQLMaint Utility (Unicode), Version Logged on to SQL Server 'ZTAO-1' as 'ZTAO-1Administrator' (trusted)
Starting maintenance plan 'LOG_Plan_9' on 2003-9-4 14:42:02
Backup can not be performed on database 'ERPLogShipping'. This sub task is ignored.
Deleting old text reports... 0 file(s) deleted.
End of maintenance plan 'LOG_Plan_9' on 2003-9-4 14:42:02
SQLMAINT.EXE Process Exit Code: 1 (Failed)
可能是你没有正确设置数据库的模式,完整模式。
三、Log文件存放路径
在MSDN上看过一篇文章说,同一台电脑上再次设置Log Shipping时,不要使用相同的目录存放Log文件。这个没有考证过,只提一下,提醒大家!
MySQL加密函数保护Web网站敏感数据
如果您正在运行使用MySQL的Web应用程序,那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争优势。幸运的是,MySQL带有很多设计用来提供这种类型安全的加密函数。本文概述了其中的一些函数,并说明了如何使用它们,以及它们能够提供的不同级别的安全。
sql server关于函数中如何使用Getdate()
create view v_getdate
as
select getdate() [output]
go
---------------------------------------------------------------
create function f_getdate()
returns datetime
as
begin
declare @n datetime
select @n = output from v_getdate
return(@n)
end
go
---------------------------------------------------------------
调用:select dbo.f_getdate()
======================================================================
-----以下是解析--------
应为function内部不允许使用
函数可以是确定的或不确定的。如果任何时候用一组特定的输入值调用函数时返回的结果总是相同的,则这些函数为确定的。如果每次调用函数时即使用的是相同的一组特定输入值,返回的结果总是不同的,则这些函数为不确定的。
不确定的函数会产生副作用。副作用是更改数据库的某些全局状态,比如更新数据库表或某些外部资源,如文件或网络等(例如,修改文件或发送电子邮件消息)。
不允许在用户定义函数主体中内置不确定函数;这些不确定函数如下:
@@CONNECTIONS @@TOTAL_ERRORS
@@CPU_BUSY @@TOTAL_READ
@@IDLE @@TOTAL_WRITE
@@IO_BUSY GETDATE
@@MAX_CONNECTIONS GETUTCDATE
@@PACK_RECEIVED NEWID
@@PACK_SENT RAND
@@PACKET_ERRORS TEXTPTR
@@TIMETICKS
尽管在用户定义函数主体中不允许有不确定函数,这些用户定义函数在调用扩展存储过程时仍会产生副作用。
由于扩展存储过程会对数据库产生副作用,因此调用扩展存储过程的函数是不确定的。当用户定义函数调用会对数据库产生副作用的扩展存储过程时,不要指望结果集保持一致或执行函数。
关于PHP中操作MySQL数据库的一些要注意的问题
1. 分号的例外
对于 MySQL ,第一件你必须牢记的是它的每一行命令都是用分号 (;) 作为结束的,但……没有完全绝对的事,在这儿也是一样,当一行 MySQL 被插入在 PHP 代码中时,最好把后面的分号省略掉,例如:
mysql_query ("INSERT INTO tablename (first_name, last_name)
VALUES ('$first_name', '$last_name')
");
这是因为 PHP 也是以分号作为一行的结束的,额外的分号有时会让 PHP 的语法分析器搞不明白,所以还是省略掉的好。在这种情况下,虽然省略了分号,但是 PHP 在执行 MySQL 命令时会自动的帮你加上的。
另外还有一个不要加分号的情况。当你想把要字段的竖者排列显示下来,而不是像通常的那样横着排列时,你可以用 G 来结束一行 SQL 语句,这时就用不上分号了,例如:
SELECT * FROM PENPALS WHERE USER_ID = 1G
2. TEXT、DATE、和 SET 数据类型
MySQL 数据表的字段必须有定义一个数据类型。这有大约 25 种选择,大部分都是直接明了的,就不多费口舌了。但有几个有必要提一下。
TEXT 不是一种数据类型,虽然可能有些书上是这么说的。它实际上应该是“ LONG VARCHAR ”或者“ MEDIUMTEXT ”。
DATE 数据类型的格式是 YYYY-MM-DD ,比如: 1999-12-08 。你可以很轻易的用 date 函数来得到这种格式的当前系统时间:
date("Y-m-d")
并且,在 DATA 数据类型之间可以作减法,得到相差的时间天数:
$age = ($current_date - $birthdate);
集合 SET 是一个有用的数据类型,它和枚举 ENUM 有点相似,只不过是 SET 能够保存多个值而 ENUM 只能保存一个值而已。而且, SET 类型最多只能够有 64 个预定的值,而 ENUM 类型却能够处理最多 65,535 个预定义的值。而假如需要有大于 64 个值的集合,该怎么办呢?这时就需要定义多个集合来一起解决这个问题了。
3. 通配符
SQL 的通配符有两种:“ * ”和“ % ”。分别用在不同的情况下。例如:假如你想看到数据库的所有内容,可以像这样来查询:
SELECT * FROM dbname WHERE USER_ID LIKE '%';
这儿,两个通配符都被用上了。他们表示相同的意思 ?? 都是用来匹配任何的字符串,但是他们用在不同的上下文中。“ * ”用来匹配字段名,而“ % ”用来匹配字段值。另外一个不轻易引起注重的地方是“ % ”通配符需要和 LIKE 要害字一起使用。
还有一个通配符,就是下划线“ _ ”,它代表的意思和上面不同,是用来匹配任何单个的字符的。
4. NOT NULL 和空记录
假如用户在没有填任何东西的情况下按了 submit 按钮,会怎样呢?假如你确实需要一个值,那么可以用客户端脚本或者服务器端脚本来进行数据验证,这一点在前面已经说过了。但是,在数据库中却是答应一些字段被空出来什么也不填。对此类纪录, MySQL 将要为之执行一些事情:
插入值 NULL ,这是缺省的操作。
假如你在字段定义中为之声明了 NOT NULL (在建立或者修改这个字段的时候), MySQL 将把这个字段空出来什么东西也不填。
对于一个 ENUM 枚举类型的字段,假如你为之声明了 NOT NULL , MySQL 将把枚举集的第一个值插入到字段中。也就是说, MySQL 把枚举集的第一个值作为这个枚举类型的缺省值。
一个值为 NULL 的纪录和一个空纪录是有一些区别的。 % 通配符可以匹配空纪录,但是却不能匹配 NULL 纪录。在某些时候,这种区别会造成一些意想不到的后果。就我的经验而言,任何字段都应该声明为 NOT NULL 。这样下面的 SELECT 查询语句就能够正常运转了:
if (!$CITY) {$CITY = "%";}
$selectresult = mysql_query ("SELECT * FROM dbname
WHERE FIRST_NAME = ' 柳 '
AND LAST_NAME = ' 如风 '
AND CITY LIKE '$CITY'
");
在第一行中,假如用户没有指定一个 CITY 值,那么就会用通配符 % 来代入 CITY 变量,这样搜索时就会把任何的 CITY 值都考虑进去,甚至包括那些 CITY 字段为空的纪录。
但是假如有一些纪录,它的 CITY 字段值是 NULL ,这时问题就出现了。上面的查询是不能够找到这些字段的。问题的一个解决办法可以是这样:
if (!$CITY) {$CITY = "%";}
$selectresult = mysql_query ("SELECT * FROM dbname
WHERE FIRST_NAME = ' 柳 '
AND LAST_NAME = ' 如风 '
AND (CITY LIKE '$CITY' OR CITY IS NULL)
");
注重在搜索 NULL 时,必须用“ IS ”要害字,而 LIKE 时不会正常工作的。
在最后要提到的是,假如你在加入或者修改一个新的字段之前,数据库中已经有了一些记录了,这时新加入的字段在原来的纪录中的值,可能是 NULL ,也可能为空。这也算是 MySQL 的一个 Bug 吧,所以在这种情况下,使用 SELECT 查询要非凡的小心。
XMLHTTP刷新远程数据的PHP JS代码演示(支持中文)
xmlhttp,无刷新声,无漏斗标记,效果最好,不过就是对浏览器要求高,好在我的应用只是一个附属的功能,因此不需要用户必须开启这个控件……最后决定采用这个方案
我写了一个测试程序,代码如下,供大家参考:
==test2.php=================
<?
session_start();
echo "现在时间是:".date("Y-m-d H:i:s ",time());
?>
==eg4.php==================
<script language="javascript">
function re()
{
var http = new ActiveXObject("Microsoft.XMLHTTP");
http.open("GET","test2.php",false);
http.send();
var str = bytes2BSTR(http.responsebody);
t.innerHTML=str;
setTimeout( "re()" , 2000 );
}
</script>
<script language=vbscript>
Function bytes2BSTR(vIn)
dim i
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i 1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 CInt(NextCharCode))
i = i 1
End If
Next
bytes2BSTR = strReturn
End Function
</script>
<body onload="re();">
<span id=t>数据载入中</span>
</body>
这样,当你运行eg4.php时,页面会出现当前时间,每2秒刷新一次,看不到进度条,也没有小漏斗标记了