今天才发现SQL Server里面的COALESCE功能的强大性, 用MSND上面的定义"Returns the first nonnull expression among its arguments.” 并不能了解到太多使用的好处,仅仅知道可以返回第一个非空的表达式。它这一点跟ISNULL很类似, 比如COALESCE(@test, '') 跟 ISNULL(@test, '')是等价的。但是它可以传入N个参数, ISNULL只能有两个参数。
其实COALESCE最大的妙处是可以避免使用cursor,于是可以达到减少一些代码的功效。
比如,假如你想把表格里面的某列的数据显示在一个列里面,怎么做?用cursor循环把一行一行的数据拿出去赋值到一个变量里面?使用COALESCE就可以避免使用loop的情况。
--1. 创建表格
CREATE TABLE Test
(
id INT,
value NVARCHAR(1000)
)
--插入五行数据
INSERT INTO Test
SELECT 1, 'a'
UNION
SELECT 2, 'b'
UNION
SELECT 3, 'c'
UNION
SELECT 4, 'd'
UNION
SELECT 5, 'e'
--SELECT * FROM Test
-- 3. 定义一个变量以保存value列的数据
DECLARE @result NVARCHAR(MAX)
SELECT @result = COALESCE(@result, '') + value + ' > ' --重点在此!
FROM Test
SELECT @result
猜想一下结果会是什么?
a > b > c > d > e >
哈哈,妙吧? 使用这个功能便可以动态地执行多个sql语句了。以下这个例子很实用,直接拷贝自
【http://www.mssqltips.com/tip.asp?tip=1521】
DECLARE @SQL VARCHAR(8000)SELECT @SQL=COALESCE(@SQL,'')+'Kill '+CAST(spid AS VARCHAR(10))+ '; '
FROM sys.sysprocesses
WHERE DBID=DB_ID('AdventureWorks')
PRINT @SQL --EXEC(@SQL) Replace the print statement with exec to execute
这个语句很实用吧,可以用来关闭所有占用这个AdventureWorks数据库的事务,这样你在还原数据库AdventureWorks的时候就不会出现令人讨厌的“数据库正在被使用中。。。”的警告了!