1.先说动态查询,目前已知有如下几种方法:
经过比较,我认为最后一种方法最简单方便,只须简单的在原来的SQL语句上稍加扩展即可达到目的。
需要声明的是,这种写法是博客园里的edobnet网友提出的。
文章地址为http://www.cnblogs.com/edobnet/archive/2004/07/16/24781.html
但由于他的文章有很多人回复,比较乱,所以我特意把原文及回复做了一下归纳。
其中比较有特点的SQL写法有:
--
博客园网友edobnet的写法
SELECT
*
FROM
table
WHERE
(addDate
=
@addDate
OR
@addDate
IS
NULL
)
AND
(name
=
@name
OR
@name
=
''
)
--
博客园网友goodspeed的写法
SELECT
*
FROM
table
WHERE
(addDate
=
CASE
@addDate
IS
NULL
THEN
addDate
ELSE
@addDate
END
)
AND
(name
=
CASE
@name
WHEN
''
THEN
name
ELSE
@name
END
)
--
网友Hanjoe的写法
SELECT
*
FROM
table
WHERE
addDate
=
ISNULL
(
@addDate
,addDate)
AND
name
=
ISNULL
(
@name
,name)
第三种写法最简洁,但是有缺点——对@name使用ISNULL,只考虑了@name为null的情况却没考虑@name是空字符串(@name='')时的情况。
要知道对于数据库来说空字符串('')和null并不是一回事。(关于null,更详细的介绍请参见《.NET和SQL Server中“空值”辨析 (DBNull与Null的区别)》一文)
总体来看,还是第一种写法相对简洁、完善一些。当然也可以把第一和第三种写法综合,看个人习惯了。
2.使用LIKE
如果LIKE后面的条件包含变量,则直接连写会导致识别错误,如:
LIKE
'
%@CategoryName%
'
可见变量名被当成了文本。
正确的写法是:
LIKE
'
%
'
+
@CategoryName
+
'
%
'
(可参考 “如何設定TableAdapter.FillBy條件使用LIKE” )
3.完整代码举例如下:
SELECT
StationID, CompanyName, ContactName, Address, City, PostCode, Phone,
Fax
FROM
Stations
WHERE
(StationID
=
@StationID
OR
@StationID
=
''
)
AND
(CompanyName
LIKE
'
%
'
+
@CompanyName
+
'
%
'
OR
@CompanyName
=
''
)
AND
(ContactName
LIKE
'
%
'
+
@ContactName
+
'
%
'
OR
@ContactName
=
''
)