SQLServer常见问题应对

SQL语句部分

1、SQL语句跨两个以上的数据库

问题:有时某个SQL语句需要使用两个以上的数据库,这样的SQL语句怎么写呢?

解答:采用DataBaseName..TableName来访问表就可以了。

举例:

2、匹配查询

问题:我要实现字符串的匹配查询,该怎么做呢?

解答:like,请参见SQLServer2000的联机帮助。在索引中输入“like”,内有非常详细的说明和示例。

补充:该问题的提出是因为笔者在查询所有面料包含文字“50%纯棉”的时候引出的,因为它包含一个或多个特殊通配符%”。当笔者写出如下语句时:

   

执行结果为(非真实数据): 

正确的写法是:

:

3、交叉数据报表

问题:如何获取交叉数据查询结果?

解答:更为详细的内容请参见SQLServer2000联机帮助。在索引中输入“交叉数据报表”,即可查看。

补充:在程序中可以先用Distinct或Group选出满足条件的所有交叉数据列,然后构造出交叉数据查询语句;如果想一个写存储过程用于返回数据结果集,可以使用游标、生成查询字符串,然后用系统存储过程sp_executesql执行该字符串。 

4、都是尾部空格惹的祸

问题:在用like查询数据时,感觉自己写的SQL语句没有问题,就是得不到想要的数据,怎么回事呢?

解答:

A.由于数据存储方式的原因,使用包含 char(固定长度) 和 varchar(可变长度) 数据模式的字符串比较可能无法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。

B.当对 Unicode 数据(nchar 或 nvarchar 数据类型)使用 LIKE 时,尾随空格是有意义的。但是对于非 Unicode 数据,尾随空格没有意义。

补充:请读者自己在下面做一些试验,亲身感受一下其中的区别。 

(未完待续……)


5、“令人头疼”的日期处理

问题:你是否也有过面对日期处理时的彷徨无措么?

解答:你是否了解以下事实(摘选自SQLServer2000联机帮助-datetime 数据类型:概述):

A.日期的存储。

datetime

1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确度为百分之三秒(等于 3.33 毫秒或 0.00333 秒)。如下表所示,把值调整到 .000、.003、或 .007 秒的增量。

smalldatetime

1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据精确到分钟。29.998 秒或更低的 smalldatetime 值向下舍入为最接近的分钟,29.999 秒或更高的 smalldatetime 值向上舍入为最接近的分钟。

Microsoft SQL Server 用两个 4 字节的整数内部存储 datetime 数据类型的值。第一个 4 字节存储 base date(即 1900 年 1 月 1 日)之前或之后的天数。基础日期是系统参考日期。不允许早于 1753 年 1 月 1 日的 datetime 值。另外一个 4 字节存储以午夜后毫秒数所代表的每天的时间。

smalldatetime 数据类型存储日期和每天的时间,但精确度低于 datetime。SQL Server 将 smalldatetime 的值存储为两个 2 字节的整数。第一个 2 字节存储 1900 年 1 月 1 日后的天数。另外一个 2 字节存储午夜后的分钟数。日期范围从1900 年 1 月 1 日到 2079 年 6 月 6 日,精确到分钟。

B.没有只存储时间或日期的独立的时间和日期数据类型。当设置 datetime 或 smalldatetime 值时,如果只指定时间,则日期默认为 1900 年 1 月 1 日。如果只指定日期,则时间默认为 12:00 AM(午夜)。

C.下面是一些使用日期和时间数据的准则:

· 若要对日期和时间进行精确搜索匹配,请使用等号(=)。Microsoft SQL Server 以 12:00:00:000 AM(默认值)的精确时间形式返回年、月、日都完全匹配的日期和时间值。

· 若要搜寻日期或时间的一部分,请使用 LIKE 运算符。SQL Server 首先把数据转换为 datetime 格式然后再转换为 varchar 格式。由于标准时间显示格式不包括秒和毫秒,不能使用 LIKE 和匹配模式对其搜索,除非使用 CONVERT 函数并把 style 参数设为 9 或 109。有关部分日期和时间搜索的更多信息,请参见 LIKE。

· SQL Server 在运行时计算 datetime 常量。用于某种语言期望的日期格式的日期字符串,如果由使用不同语言和日期格式设置的连接来执行查询,则可能无法识别。例如,下面的视图对于语言设置为美国英语的连接可以工作正常,但对于其它语言设置的连接就不能工作正常:

    CREATE VIEW USA_Dates AS

    SELECT *

    FROM Northwind.dbo.Orders

    WHERE OrderDate < 'May 1, 1997'

当在查询中使用 datetime 常量,而且该查询由使用不同语言设置的连接执行时,需确保日期对于所有语言设置均是可以接受的。对于国际数据库中永久对象中的 datetime 常量,比如表约束和查看 WHERE 子句,必须同样小心。有关所有语言设置都解释为相同的日期格式的更多信息,请参见编写国际 Transact-SQL 语句。

SQL Server 可以识别以下列格式括在单引号 (') 中的日期和时间:

· 字母日期格式(例如,'April 15, 1998')

· 数字日期格式(例如,'4/15/1998'、'April 15,1998')

· 未分隔的字符串格式(例如'19981207'、'December 12, 1998')  

6、设计期无法确定的SQL语句

问题:在写存储过程时,有些SQL语句在设计期是不确定的,这样的SQL语句怎么写呢?

解答:用系统存储过程sp_executesql。

7、常用且重要函数、关键字和子句

A.CASE - 计算条件列表并返回多个可能结果表达式之一

B.ISNULL - 使用指定的替换值替换 NULL

C.HAVING 子句 - 指定组或聚合的搜索条件。HAVING 通常与 GROUP BY 子句一起使用。如果不使用 GROUP BY 子句,HAVING 的行为与 WHERE 子句一样。


posted on 2005-03-16 10:16  轻松逍遥子  阅读(648)  评论(0编辑  收藏  举报