SQL Server允许重复空字段不空字段值唯一
发布时间:2019-04-13浏览次数:985
<p>
</p>
<table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#fdfddf">
<font color="#ff0000">WebjxCom提示:</font><font color="#000000">SQL Server如何保证可空字段中非空值唯一.</font>
</td>
</tr></tbody></table>
<p>今天同学向我提了一个问题,我觉得蛮有意思,现记录下来大家探讨下。问题是:在一个表里面,有一个允许为空的字段,空是可以重复的,但是不为空的值需要唯一。</p>
<p>表结构如下面代码创建</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">TABLE</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">(<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">    TestId </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">int</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff00ff; FONT-SIZE: 12pt">identity</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">) </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">primary</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">key</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">    Caption </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">nvarchar</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(</span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">100</span><span style="COLOR: #000000; FONT-SIZE: 12pt">) </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">);<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>解决方案1:</p>
<p>对于这个问题,大家的第一个想法可能是:在Caption这个字段上面加一个唯一键不就可以了吗?好,我们按着这个思路做下去,先创建唯一索引。</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">UNIQUE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NONCLUSTERED</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INDEX</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> un_test_tb <br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">ON</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>索引创建好了,我们来测试下效果</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>运行之后我们会收到下面的错误信息:</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div><span style="COLOR: #000000; FONT-SIZE: 12pt">
<div>
<span style="COLOR: #000000; FONT-SIZE: 12pt">消息 </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">2601</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,级别 </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">14</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,状态 </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">,第 </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> 行<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">不能在具有唯一索引 </span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">un_test_tb</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> 的对象 </span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">dbo.test_tb</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> 中插入重复键的行。<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">语句已终止。</span>
</div>
</span></div>
</td>
</tr></tbody></table>
<p>所以该解决方案是不行的。</p>
<p>解决方案2:</p>
<p>添加约束,让<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server在插入数据的时候,先验证下已有数据中是否有现在要插入的这个值。由于这个约束不是简单的一个运算,因此我们先创建一个函数,然后再在约束中调用这个函数。</p>
<p>创建验证逻辑函数:</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FUNCTION</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">[</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">dbo</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">]</span><span style="COLOR: #000000; FONT-SIZE: 12pt">.</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">[</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">fn_CK_test_tb_Caption</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">]</span><span style="COLOR: #000000; FONT-SIZE: 12pt">()<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">RETURNS</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">BIT</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">AS</span><span style="COLOR: #000000"> <br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">BEGIN</span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">IF</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(</span><span style="COLOR: #808080; FONT-SIZE: 12pt">EXISTS</span><span style="COLOR: #000000; FONT-SIZE: 12pt">(<br>    </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000">    </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000"><br>    </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">AS</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> a<br>    </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">WHERE</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (Caption </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">IS</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NULL</span><span style="COLOR: #000000; FONT-SIZE: 12pt">) </span><span style="COLOR: #808080; FONT-SIZE: 12pt">AND</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">EXISTS</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">      (</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">AS</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> Expr1<br>        </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb<br>        </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">WHERE</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (Caption </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">IS</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NULL</span><span style="COLOR: #000000; FONT-SIZE: 12pt">) </span><span style="COLOR: #808080; FONT-SIZE: 12pt">AND</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (Caption </span><span style="COLOR: #808080; FONT-SIZE: 12pt">=</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> a.Caption) </span><span style="COLOR: #808080; FONT-SIZE: 12pt">AND</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (a.TestId </span><span style="COLOR: #808080; FONT-SIZE: 12pt"><></span><span style="COLOR: #000000; FONT-SIZE: 12pt"> TestId))<br></span><span style="COLOR: #000000; FONT-SIZE: 12pt">     ))<br>        </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">RETURN</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">0</span><span style="COLOR: #000000"><br>    <br>    </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">RETURN</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">END</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>在约束中引用函数:</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">ALTER</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">TABLE</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">ADD</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">CONSTRAINT</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> CK_test_tb_Caption </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">CHECK</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (dbo.fn_CK_test_tb_Caption() </span><span style="COLOR: #808080; FONT-SIZE: 12pt">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #800000; FONT-SIZE: 12pt; FONT-WEIGHT: bold">1</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>现在来测试下效果。先来测试NULL值</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (</span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>可以成功运行,而且也出了多行为NULL的情况。现在再来测试不为空的插入情况。</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div><span style="COLOR: #0000ff; FONT-SIZE: 12pt">
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (N</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">AAA</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (N</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">BBB</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INSERT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INTO</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb (Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">VALUES</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> (N</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">BBB</span><span style="COLOR: #ff0000; FONT-SIZE: 12pt">'</span><span style="COLOR: #000000; FONT-SIZE: 12pt">)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">FROM</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</span></div>
</td>
</tr></tbody></table>
<p>结果是在第三条语句的时候报错了,表中的Caption字段也有‘AAA’和‘BBB’了,这也正好是我们要的结果。</p>
<p>所以解决方案2是正确的。但是为了这么一个小小功能,就写这么长一段东西是不是太繁琐了呢?我们来看下面的解决方案。</p>
<p>解决方案3:(只适用于<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 2008)</p>
<p><a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 2008中有了一个优雅的解决方案,那就是筛选索引。筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。筛选索引使用筛选谓词对表中的部分行进行索引。有了筛选索引,我们只需要写一条语句就达到上面的效果。</p>
<p>
</p>
<table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr>
<td style="WORD-WRAP: break-word" bgcolor="#ddedfb">
<p><font color="#ff0000">以下为引用的内容:</font></p>
<div>
<span style="COLOR: #0000ff; FONT-SIZE: 12pt">CREATE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">UNIQUE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">NONCLUSTERED</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">INDEX</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> un_test_tb <br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">ON</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> test_tb(Caption)<br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">WHERE</span><span style="COLOR: #000000; FONT-SIZE: 12pt"> Caption </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">is</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080; FONT-SIZE: 12pt">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">null</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff; FONT-SIZE: 12pt">GO</span>
</div>
</td>
</tr></tbody></table>
<p>再用上面的一些测试语句来测试的话,会发现完全是达到了我们的要求。这个方案的唯一缺点就是该语句只有<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server 2008支持。不知道各位有没有又优雅又适用于各个版本的<a href="http://www.webjx.com/database/sqlserver/"><u>SQL</u></a> Server的解决方案,望不胜赐教。(来源:<a href="http://www.cnblogs.com/caspnet/archive/2011/02/23/1962638.html" target="_blank"><font color="#0000ff">博客园</font></a>)</p>