<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sqlserver &#8211; FoxDevelop</title>
	<atom:link href="https://www.foxdevelop.com/zh/category/sqlserver/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>独立软件开发工作室</description>
	<lastBuildDate>Tue, 29 Sep 2026 09:05:37 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://www.foxdevelop.com/wp-content/uploads/2026/05/fox-svgrepo-com-1.png</url>
	<title>Sqlserver &#8211; FoxDevelop</title>
	<link>https://www.foxdevelop.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>18-遍历文档树</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/18-%e9%81%8d%e5%8e%86%e6%96%87%e6%a1%a3%e6%a0%91/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/18-%e9%81%8d%e5%8e%86%e6%96%87%e6%a1%a3%e6%a0%91/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:51:26 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13722</guid>

					<description><![CDATA[子节点 一个Tag可能包含多个字符串或其它的Tag，这些都是 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">子节点</p>



<p class="wp-block-paragraph">一个Tag可能包含多个字符串或其它的Tag，这些都是这个Tag的子节点。Beautiful Soup提供了许多操作和遍历子节点的属性。</p>



<p class="wp-block-paragraph">注意：Beautiful Soup中字符串节点不支持这些属性，因为字符串没有子节点。</p>



<p class="wp-block-paragraph">tag的名字</p>



<p class="wp-block-paragraph">操作文档树最简单的方法就是告诉它你想获取的tag的name。如果想获取 <code>&lt;head&gt;</code> 标签，只要用 <code>soup.head</code>：</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">print(soup.head)
# <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>The Dormouse's story<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span></code></span></pre>


<p class="wp-block-paragraph">这是个获取tag的小窍门，可以在文档树的tag中多次调用这个方法。下面的代码可以获取 <code>&lt;body&gt;</code> 标签中的第一个 <code>&lt;b&gt;</code> 标签：</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">print</span>(soup.body.b)
<span class="hljs-comment"># &lt;b&gt;The Dormouse's story&lt;/b&gt;</span></code></span></pre>


<p class="wp-block-paragraph">通过点取属性的方式只能获得当前名字的第一个tag：</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">print(soup.a)
# <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"sister"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"http://example.com/elsie"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"link1"</span>&gt;</span>Elsie<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span></code></span></pre>


<p class="wp-block-paragraph">如果想要得到所有的 <code>&lt;a&gt;</code> 标签，或是通过名字得到比一个tag更多的内容的时候，就需要用到 Searching the tree 中描述的方法，比如：<code>find_all()</code></p>


<pre class="wp-block-code"><span><code class="hljs language-xml">print(soup.find_all('a'))
# &#91;<span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"sister"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"http://example.com/elsie"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"link1"</span>&gt;</span>Elsie<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>,
#  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"sister"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"http://example.com/lacie"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"link2"</span>&gt;</span>Lacie<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>,
#  <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"sister"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"http://example.com/tillie"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"link3"</span>&gt;</span>Tillie<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span>]</code></span></pre>]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/18-%e9%81%8d%e5%8e%86%e6%96%87%e6%a1%a3%e6%a0%91/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>字符截取字符串</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/%e5%ad%97%e7%ac%a6%e6%88%aa%e5%8f%96%e5%ad%97%e7%ac%a6%e4%b8%b2/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/%e5%ad%97%e7%ac%a6%e6%88%aa%e5%8f%96%e5%ad%97%e7%ac%a6%e4%b8%b2/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:14:33 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13694</guid>

					<description><![CDATA[借助 SUBSTRING、CHARINDEX、LEN 按指定 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">借助 SUBSTRING、CHARINDEX、LEN 按指定字符截取字符串</h3>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">DECLARE</span> <span class="hljs-keyword">@name</span> NVARCHAR(<span class="hljs-number">50</span>)
SET @name = <span class="hljs-string">'000001-23534324234'</span>

-- 借助 SUBSTRING、CHARINDEX、LEN 三个函数，实现按 <span class="hljs-string">"-"</span> 字符截取
SELECT SUBSTRING(
    @name,
    CHARINDEX(<span class="hljs-string">'-'</span>, @name) + <span class="hljs-number">1</span>,
    LEN(@name) - CHARINDEX(<span class="hljs-string">'-'</span>, @name) + <span class="hljs-number">1</span>
)</code></span></pre>


<h4 class="wp-block-heading">函数拆解说明</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>函数</th><th>作用</th><th>本例中的值</th></tr></thead><tbody><tr><td><code>CHARINDEX('-', @name)</code></td><td>查找 <code>-</code> 在字符串中的位置</td><td>7</td></tr><tr><td><code>CHARINDEX('-', @name) + 1</code></td><td>截取起始位置（跳过 <code>-</code> 本身）</td><td>8</td></tr><tr><td><code>LEN(@name) - CHARINDEX('-', @name) + 1</code></td><td>截取长度（从 <code>-</code> 之后到末尾）</td><td>12</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">执行结果</h4>


<pre class="wp-block-code"><span><code class="hljs">23534324234</code></span></pre>


<h4 class="wp-block-heading">更简洁的写法</h4>



<p class="wp-block-paragraph">如果只需要截取 <code>-</code> 之后的所有内容，可以直接用 <code>RIGHT</code> 函数替代：</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-tag">RIGHT</span>(<span class="hljs-keyword">@name</span>, LEN(@name) - CHARINDEX(<span class="hljs-string">'-'</span>, @name))</code></span></pre>


<p class="wp-block-paragraph">效果相同，但代码更简洁易读。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/%e5%ad%97%e7%ac%a6%e6%88%aa%e5%8f%96%e5%ad%97%e7%ac%a6%e4%b8%b2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>访问权限</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:14:05 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13693</guid>

					<description><![CDATA[通过数据库角色与用户限制视图访问权限 在 SQL Serve ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">通过数据库角色与用户限制视图访问权限</h3>



<p class="wp-block-paragraph">在 SQL Server 中，可以通过创建自定义数据库角色、授予视图查询权限、再绑定用户的方式，实现只允许特定账号访问指定视图的效果。</p>



<h4 class="wp-block-heading">操作步骤</h4>



<p class="wp-block-paragraph"><strong>1. 选择要操作的数据库</strong></p>



<p class="wp-block-paragraph">在 SQL Server Management Studio 中切换到目标数据库（或使用 <code>USE 数据库名</code>）。</p>



<p class="wp-block-paragraph"><strong>2. 创建数据库角色</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">-- 创建一个数据库角色，名称为 seeview
EXEC sp_addrole <span class="hljs-string">'seeview'</span></code></span></pre>


<p class="wp-block-paragraph"><strong>3. 为角色分配视图查询权限</strong></p>


<pre class="wp-block-code"><span><code class="hljs">-- 授予角色对指定视图的 SELECT 权限
-- 该角色只能查看下面赋予的这些视图，除此之外的表或视图均不可见
GRANT SELECT ON v_viewname1 TO seeview
GRANT SELECT ON v_viewname2 TO seeview</code></span></pre>


<p class="wp-block-paragraph"><strong>4. 创建登录名（服务器级别）</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">-- exec sp_addlogin <span class="hljs-string">'登录名'</span>,<span class="hljs-string">'密码'</span>,<span class="hljs-string">'默认数据库名'</span>
EXEC sp_addlogin <span class="hljs-string">'guest'</span>, <span class="hljs-string">'guest'</span>, <span class="hljs-string">'ICCard_TangHe'</span></code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">注意：如果密码强度不够，<code>sp_addlogin</code> 可能执行失败。此时可以在 SSMS 界面中手动创建登录名，并勾选&#8221;强制实施密码策略&#8221;以外的选项，或设置符合强度要求的密码。</p>
</blockquote>



<p class="wp-block-paragraph"><strong>5. 创建数据库用户并绑定到角色</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">-- exec sp_adduser <span class="hljs-string">'登录名'</span>,<span class="hljs-string">'用户名'</span>,<span class="hljs-string">'角色'</span>
EXEC sp_adduser <span class="hljs-string">'guest'</span>, <span class="hljs-string">'guest'</span>, <span class="hljs-string">'seeview'</span></code></span></pre>


<h4 class="wp-block-heading">完整示例</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">-- <span class="hljs-number">1.</span> 创建数据库角色
EXEC sp_addrole <span class="hljs-string">'xfxfzfztviewer'</span>

-- <span class="hljs-number">2.</span> 分配视图查询权限给角色
GRANT SELECT ON View_XFXF_JFZT TO xfxfzfztviewer

-- <span class="hljs-number">3.</span> 创建登录名（服务器级别）
EXEC sp_addlogin <span class="hljs-string">'xfxfzfztguest'</span>, <span class="hljs-string">'xfxfzfztguestpwd2019'</span>, <span class="hljs-string">'ChargeV4.0_GuangCai_20190510'</span>

-- <span class="hljs-number">4.</span> 创建数据库用户并绑定到角色
EXEC sp_adduser <span class="hljs-string">'xfxfzfztguest'</span>, <span class="hljs-string">'xfxfzfztguest'</span>, <span class="hljs-string">'xfxfzfztviewer'</span></code></span></pre>


<h4 class="wp-block-heading">权限验证</h4>



<p class="wp-block-paragraph">使用新创建的登录名 <code>xfxfzfztguest</code> 连接数据库后：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>操作</th><th>结果</th></tr></thead><tbody><tr><td><code>SELECT * FROM View_XFXF_JFZT</code></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 成功</td></tr><tr><td><code>SELECT * FROM 其他表</code></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 拒绝访问</td></tr><tr><td><code>SELECT * FROM 未授权的视图</code></td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 拒绝访问</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">补充说明</h4>



<ul class="wp-block-list">
<li><code>sp_addrole</code>：在当前数据库中创建新的数据库角色。</li>



<li><code>sp_addlogin</code>：在 SQL Server 实例级别创建登录账号。</li>



<li><code>sp_adduser</code>：在当前数据库中创建数据库用户，并将其关联到指定角色。</li>



<li><code>GRANT SELECT ON 视图名 TO 角色名</code>：只授予对指定视图的查询权限，不授予对底层表的权限（视图需自行定义好过滤逻辑）。</li>



<li>如果需要对多个视图授权，逐条执行 <code>GRANT SELECT ON 视图名 TO 角色名</code> 即可。</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>字段信息</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/%e5%ad%97%e6%ae%b5%e4%bf%a1%e6%81%af/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/%e5%ad%97%e6%ae%b5%e4%bf%a1%e6%81%af/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:13:35 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13692</guid>

					<description><![CDATA[通过系统表查询表的字段信息 我们可以通过查询系统表来获取某一 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">通过系统表查询表的字段信息</h3>



<p class="wp-block-paragraph">我们可以通过查询系统表来获取某一张表下面的所有字段。系统表记录了整个 SQL Server 中所有库的表结构信息。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">SELECT</span> *
<span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-attr">&#91;Demo]</span>.<span class="hljs-selector-attr">&#91;dbo]</span>.<span class="hljs-selector-attr">&#91;Amount]</span>
<span class="hljs-selector-tag">GO</span></code></span></pre>


<h4 class="wp-block-heading">获取表的 Object ID</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">SELECT OBJECT_ID(<span class="hljs-string">'&#91;SportsStore].&#91;dbo].&#91;Products]'</span>)</code></span></pre>


<h4 class="wp-block-heading">通过 syscolumns 查询字段</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">SELECT * FROM syscolumns WHERE id = OBJECT_ID(<span class="hljs-string">'Amount'</span>)</code></span></pre>


<p class="wp-block-paragraph"><code>syscolumns</code> 系统表存储了每个表和视图的列信息，常用字段说明：</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>列名</th><th>说明</th></tr></thead><tbody><tr><td><code>id</code></td><td>所属表或视图的 object_id</td></tr><tr><td><code>name</code></td><td>列名</td></tr><tr><td><code>colid</code></td><td>列在表中的顺序编号</td></tr><tr><td><code>xtype</code></td><td>列的数据类型（对应 systypes 中的类型编号）</td></tr><tr><td><code>length</code></td><td>列的物理长度</td></tr><tr><td><code>isnullable</code></td><td>是否允许为 NULL（1 允许，0 不允许）</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">更推荐的查询方式（SQL Server 2005+）</h4>



<p class="wp-block-paragraph"><code>syscolumns</code> 属于旧版兼容视图，推荐使用 <code>sys.columns</code> 目录视图：</p>


<pre class="wp-block-code"><span><code class="hljs language-php">SELECT c.name <span class="hljs-keyword">AS</span> 列名,
       t.name <span class="hljs-keyword">AS</span> 数据类型,
       c.max_length <span class="hljs-keyword">AS</span> 最大长度,
       c.is_nullable <span class="hljs-keyword">AS</span> 允许空
FROM sys.columns c
JOIN sys.types t ON c.user_type_id = t.user_type_id
WHERE c.object_id = OBJECT_ID(<span class="hljs-string">'Amount'</span>)</code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-javascript">-- 或者使用 INFORMATION_SCHEMA.COLUMNS（跨数据库兼容）
SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = <span class="hljs-string">'Amount'</span></code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>总结</strong>：<code>syscolumns</code> / <code>sys.columns</code> / <code>INFORMATION_SCHEMA.COLUMNS</code> 都可以用来查询字段信息，其中 <code>sys.columns</code> 是 SQL Server 当前版本最完整、最推荐的方案。</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/%e5%ad%97%e6%ae%b5%e4%bf%a1%e6%81%af/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>in 和 Join</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/in-%e5%92%8c-join/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/in-%e5%92%8c-join/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:12:52 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13691</guid>

					<description><![CDATA[IN 与 JOIN 子查询的选择及隐式连接 有些时候进行子查 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">IN 与 JOIN 子查询的选择及隐式连接</h3>



<p class="wp-block-paragraph">有些时候进行子查询可以使用 <code>IN</code> 和 <code>JOIN</code>，但如果数据量比较多，不建议使用 <code>IN</code>。如果数据不多，可以使用 <code>IN</code>。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-attr">&#91;id]</span>
      ,<span class="hljs-selector-attr">&#91;name]</span>
      ,<span class="hljs-selector-attr">&#91;type]</span>
  <span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-attr">&#91;Demo]</span>.<span class="hljs-selector-attr">&#91;dbo]</span>.<span class="hljs-selector-attr">&#91;Category]</span>
<span class="hljs-selector-tag">GO</span></code></span></pre>


<h4 class="wp-block-heading">使用 IN 的子查询方式</h4>


<pre class="wp-block-code"><span><code class="hljs">-- 查找 type=2 的分类下面有哪些文章
-- 如果 Category 查找出来数据不大，可以使用这个方式
-- 否则数据量多，则建议使用后面 JOIN 的方式
SELECT * FROM dbo.News
WHERE cid IN
(
    -- 返回 type=2 的分类 id
    SELECT id FROM &#91;dbo].&#91;Category]
    WHERE &#91;type] = 2
)</code></span></pre>


<h4 class="wp-block-heading">使用 JOIN 的方式</h4>


<pre class="wp-block-code"><span><code class="hljs">-- 另外一种方式
SELECT * FROM dbo.News n
JOIN dbo.Category c
ON n.cid = c.id
WHERE c.&#91;type] = 2</code></span></pre>


<h4 class="wp-block-heading">隐式连接（逗号分隔）</h4>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">--</span> 笛卡尔积
<span class="hljs-selector-tag">SELECT</span> * <span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-tag">dbo</span><span class="hljs-selector-class">.News</span> <span class="hljs-selector-tag">n</span>, <span class="hljs-selector-tag">dbo</span><span class="hljs-selector-class">.Category</span> <span class="hljs-selector-tag">c</span></code></span></pre>

<pre class="wp-block-code"><span><code class="hljs">-- 加上关联条件后结果和 JOIN 一样
SELECT * FROM dbo.News n, dbo.Category c
WHERE n.cid = c.id</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>建议</strong>：当子查询返回数据量较大时，<code>IN</code> 会导致性能下降，因为 SQL Server 会对外部表的每一行执行一次子查询匹配。此时使用 <code>JOIN</code> 可以利用索引进行集合级别的关联，效率更高。数据量小时两者差异不明显，但养成使用 <code>JOIN</code> 的习惯更有利于后续性能维护。</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/in-%e5%92%8c-join/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>FOR XML PATH</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/for-xml-path-2/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/for-xml-path-2/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:11:57 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13690</guid>

					<description><![CDATA[FOR XML PATH 合并分组后的多行数据 分组后不能直 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">FOR XML PATH 合并分组后的多行数据</h3>



<p class="wp-block-paragraph">分组后不能直接显示非分组字段，因为非分组字段在每个分组中可能有多个值。如果一定要把多个值显示在一行中，可以使用 <code>FOR XML PATH</code> 将查询结果以 XML 文档形式合并为一行一列。</p>



<h4 class="wp-block-heading">子查询必须返回一行一列</h4>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">--</span> 子查询必须返回的结果是一行一列
<span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-tag">age</span>, (<span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-tag">TOP</span> 1 <span class="hljs-selector-tag">name</span> <span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-attr">&#91;Demo]</span>.<span class="hljs-selector-attr">&#91;dbo]</span>.<span class="hljs-selector-attr">&#91;Person]</span>) <span class="hljs-selector-tag">AS</span> <span class="hljs-selector-tag">names</span>
<span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-attr">&#91;Demo]</span>.<span class="hljs-selector-attr">&#91;dbo]</span>.<span class="hljs-selector-attr">&#91;Person]</span>
<span class="hljs-selector-tag">GROUP</span> <span class="hljs-selector-tag">BY</span> <span class="hljs-selector-tag">age</span></code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">--</span> 使用 <span class="hljs-selector-tag">FOR</span> <span class="hljs-selector-tag">XML</span> <span class="hljs-selector-tag">PATH</span>，子查询结果也是一行一列（<span class="hljs-selector-tag">XML</span> 字符串）
<span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-tag">age</span>, (<span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-tag">name</span> <span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-attr">&#91;Demo]</span>.<span class="hljs-selector-attr">&#91;dbo]</span>.<span class="hljs-selector-attr">&#91;Person]</span> <span class="hljs-selector-tag">FOR</span> <span class="hljs-selector-tag">XML</span> <span class="hljs-selector-tag">PATH</span>) <span class="hljs-selector-tag">AS</span> <span class="hljs-selector-tag">names</span>
<span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-attr">&#91;Demo]</span>.<span class="hljs-selector-attr">&#91;dbo]</span>.<span class="hljs-selector-attr">&#91;Person]</span>
<span class="hljs-selector-tag">GROUP</span> <span class="hljs-selector-tag">BY</span> <span class="hljs-selector-tag">age</span></code></span></pre>


<h4 class="wp-block-heading">带条件的子查询</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">-- 带上条件，条件中也必须使用分组字段
SELECT age, (SELECT name FROM &#91;Demo].&#91;dbo].&#91;Person] WHERE age = p.age <span class="hljs-keyword">FOR</span> XML PATH) <span class="hljs-keyword">AS</span> names
FROM &#91;Demo].&#91;dbo].&#91;Person] p
GROUP BY age</code></span></pre>


<h4 class="wp-block-heading">去掉 XML 标记</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">-- path 可以传入字符串作为每个元素的根元素，传入空字符串则去掉默认的根元素
SELECT age, (SELECT name <span class="hljs-keyword">AS</span> username FROM &#91;Demo].&#91;dbo].&#91;Person] WHERE age = p.age <span class="hljs-keyword">FOR</span> XML PATH(<span class="hljs-string">''</span>)) <span class="hljs-keyword">AS</span> names
FROM &#91;Demo].&#91;dbo].&#91;Person] p
GROUP BY age</code></span></pre>


<h4 class="wp-block-heading">去掉字段名标签并拼接分隔符</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">-- 把字段名标签也去掉，只需要拼接一个字符串即可
SELECT age, (SELECT name + <span class="hljs-string">','</span> FROM &#91;Demo].&#91;dbo].&#91;Person] WHERE age = p.age <span class="hljs-keyword">FOR</span> XML PATH(<span class="hljs-string">''</span>)) <span class="hljs-keyword">AS</span> names
FROM &#91;Demo].&#91;dbo].&#91;Person] p
GROUP BY age</code></span></pre>


<h4 class="wp-block-heading">去掉末尾多余的分隔符</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">-- 使用 STUFF 函数去掉末尾多余的逗号
SELECT age, STUFF(
    (SELECT <span class="hljs-string">','</span> + name FROM &#91;Demo].&#91;dbo].&#91;Person] WHERE age = p.age <span class="hljs-keyword">FOR</span> XML PATH(<span class="hljs-string">''</span>))
, <span class="hljs-number">1</span>, <span class="hljs-number">1</span>, <span class="hljs-string">''</span>) <span class="hljs-keyword">AS</span> names
FROM &#91;Demo].&#91;dbo].&#91;Person] p
GROUP BY age</code></span></pre>


<p class="wp-block-paragraph"><code>STUFF(字符串, 起始位置, 删除长度, 替换字符串)</code> 这里从第 1 个字符开始删除 1 个字符（即去掉开头的逗号），实现干净的多值合并效果。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/for-xml-path-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PRINT</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/print/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/print/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:11:31 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13689</guid>

					<description><![CDATA[你这段代码在语法上是正确的，执行逻辑如下： 执行流程说明 执 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">你这段代码在语法上是正确的，执行逻辑如下：</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">DECLARE</span> @total INT
SET @total = <span class="hljs-number">1</span>
SELECT @total = COUNT(<span class="hljs-number">1</span>) FROM Category
<span class="hljs-keyword">PRINT</span> <span class="hljs-string">'www.foxdevelop.com'</span> + CONVERT(NVARCHAR(<span class="hljs-number">10</span>), @total)</code></span></pre>


<h3 class="wp-block-heading">执行流程说明</h3>



<ol class="wp-block-list">
<li><strong>声明变量</strong>：<code>DECLARE @total INT</code> 定义一个整型变量。</li>



<li><strong>赋初值</strong>：<code>SET @total = 1</code>，初始值为 1。</li>



<li><strong>查询赋值</strong>：<code>SELECT @total = COUNT(1) FROM Category</code>，将 <code>Category</code> 表的总行数赋值给 <code>@total</code>，覆盖之前的初值。</li>



<li><strong>输出结果</strong>：<code>PRINT</code> 语句将字符串与变量拼接后输出到消息窗口。</li>
</ol>



<h3 class="wp-block-heading">执行结果示例</h3>



<p class="wp-block-paragraph">假设 <code>Category</code> 表中有 8 条记录，消息窗口会输出：</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">www</span><span class="hljs-selector-class">.foxdevelop</span><span class="hljs-selector-class">.com8</span></code></span></pre>


<h3 class="wp-block-heading">注意事项</h3>



<ul class="wp-block-list">
<li><code>PRINT</code> 输出的是纯文本，拼接时 <code>CONVERT(NVARCHAR(10), @total)</code> 是必须的，否则会报类型转换错误。</li>



<li>如果 <code>Category</code> 表为空，<code>COUNT(1)</code> 返回 <code>0</code>，输出结果为 <code>www.bamn.cn0</code>。</li>



<li><code>SELECT 变量 = 字段</code> 这种写法是 SQL Server 中将查询结果赋值给变量的常用方式，要求查询必须返回单行单列，否则变量会被赋为最后一行的值。</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/print/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CASE WHEN</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/case-when/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/case-when/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:10:32 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13688</guid>

					<description><![CDATA[CASE WHEN 简单值与范围判断 CASE 表达式有两种 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">CASE WHEN 简单值与范围判断</h3>



<p class="wp-block-paragraph"><code>CASE</code> 表达式有两种写法，一种用于等值匹配，一种用于范围判断。</p>



<h4 class="wp-block-heading">简单值匹配（CASE 后跟字段）</h4>



<p class="wp-block-paragraph">这种情况下 <code>CASE</code> 后面直接跟字段名，每个 <code>WHEN</code> 后面是一个具体的值，相当于 <code>=</code> 比较：</p>


<pre class="wp-block-code"><span><code class="hljs language-php">SELECT &#91;id]
      ,&#91;name]
      ,<span class="hljs-keyword">CASE</span> &#91;type] WHEN <span class="hljs-number">1</span> THEN <span class="hljs-string">'高级'</span> WHEN <span class="hljs-number">2</span> THEN <span class="hljs-string">'中级'</span> <span class="hljs-keyword">ELSE</span> <span class="hljs-string">'初级'</span> END <span class="hljs-keyword">AS</span> typename
FROM &#91;Test].&#91;dbo].&#91;Category]
GO</code></span></pre>


<h4 class="wp-block-heading">范围判断（CASE 后不跟字段）</h4>



<p class="wp-block-paragraph">如果是范围比较（如 <code>&gt;</code>、<code>&gt;=</code>、<code>&lt;</code> 等），<code>CASE</code> 后面不需要字段，直接在 <code>WHEN</code> 里面写条件表达式：</p>


<pre class="wp-block-code"><span><code class="hljs language-php">SELECT &#91;id]
      ,&#91;name]
      ,<span class="hljs-keyword">CASE</span> WHEN &#91;type] &gt; <span class="hljs-number">5</span> THEN <span class="hljs-string">'高级'</span> WHEN &#91;type] &gt; <span class="hljs-number">1</span> THEN <span class="hljs-string">'中级'</span> <span class="hljs-keyword">ELSE</span> <span class="hljs-string">'初级'</span> END <span class="hljs-keyword">AS</span> typename
FROM &#91;Test].&#91;dbo].&#91;Category]
GO</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>注意</strong>：<code>CASE</code> 表达式按顺序匹配，一旦满足某个 <code>WHEN</code> 条件就返回对应结果，不再继续判断后续分支。因此范围判断时需要注意条件的先后顺序，范围大的应放在后面，避免被范围小的条件提前拦截。</p>
</blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/case-when/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ISNULL 函数用法</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/isnull-%e5%87%bd%e6%95%b0%e7%94%a8%e6%b3%95/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/isnull-%e5%87%bd%e6%95%b0%e7%94%a8%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:10:13 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13687</guid>

					<description><![CDATA[ISNULL 函数用法 isnull(t.je,0) 表示如 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">ISNULL 函数用法</h3>



<p class="wp-block-paragraph"><code>isnull(t.je,0)</code> 表示如果 <code>je</code> 是 <code>NULL</code>，则用后面第二个参数 <code>0</code> 作为值。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">SELECT name,
       ISNULL((SELECT TOP <span class="hljs-number">1</span> age FROM person p WHERE p.name = per.name <span class="hljs-keyword">AND</span> p.id != per.id), <span class="hljs-number">0</span>) <span class="hljs-keyword">AS</span> age
FROM person per
GROUP BY per.name, per.id</code></span></pre>

<pre class="wp-block-code"><span><code class="hljs language-php">SELECT name,
       ISNULL(je, <span class="hljs-number">0</span>) <span class="hljs-keyword">AS</span> je -- 如果 je 是 <span class="hljs-keyword">null</span>，则用后面的 <span class="hljs-number">0</span> 来代替
FROM product</code></span></pre>


<p class="wp-block-paragraph"><code>isnull(字段, 替代值)</code> 常用于处理可能为 <code>NULL</code> 的列，避免 <code>NULL</code> 参与计算或显示时产生异常结果。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/isnull-%e5%87%bd%e6%95%b0%e7%94%a8%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>使用临时表进行数据迁移与查询优化</title>
		<link>https://www.foxdevelop.com/zh/2026/09/29/%e4%bd%bf%e7%94%a8%e4%b8%b4%e6%97%b6%e8%a1%a8%e8%bf%9b%e8%a1%8c%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%b8%8e%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96/</link>
					<comments>https://www.foxdevelop.com/zh/2026/09/29/%e4%bd%bf%e7%94%a8%e4%b8%b4%e6%97%b6%e8%a1%a8%e8%bf%9b%e8%a1%8c%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%b8%8e%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 08:09:45 +0000</pubDate>
				<category><![CDATA[Sqlserver]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=13686</guid>

					<description><![CDATA[使用临时表进行数据迁移与查询优化 当我们需要把一个数据库的数 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">使用临时表进行数据迁移与查询优化</h3>



<p class="wp-block-paragraph">当我们需要把一个数据库的数据迁移到另外一个数据库的时候，就可以大量使用临时表。临时表可以帮我们缓存临时数据，避免多次执行相同的查询。我们先把数据保存到临时表中，以后就不需要再反复执行 <code>SELECT</code> 查询。使用临时表也会使思路更清晰。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">SELECT name,
       (SELECT TOP <span class="hljs-number">1</span> age FROM person p WHERE p.name = per.name <span class="hljs-keyword">AND</span> p.id != per.id) <span class="hljs-keyword">AS</span> age
INTO <span class="hljs-comment">#temp</span>
FROM person per
GROUP BY per.name, per.id

SELECT * FROM <span class="hljs-comment">#temp -- 不需要每次都读取硬盘，因为数据已经保存到内存中的临时表了</span></code></span></pre>


<h4 class="wp-block-heading">有临时表的操作</h4>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">SELECT</span> * <span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-tag">person</span>
<span class="hljs-selector-tag">WHERE</span> <span class="hljs-selector-tag">age</span> <span class="hljs-selector-tag">IN</span>
(
    <span class="hljs-selector-tag">SELECT</span> <span class="hljs-selector-tag">age</span> <span class="hljs-selector-tag">FROM</span> <span class="hljs-selector-id">#temp</span>
)</code></span></pre>


<h4 class="wp-block-heading">没有临时表的情况</h4>



<p class="wp-block-paragraph">如果没有临时表，每次都要执行 <code>IN</code> 里面的 <code>SELECT</code> 语句，该语句读取的是硬盘中的实体表：</p>


<pre class="wp-block-code"><span><code class="hljs language-php">SELECT * FROM person
WHERE age IN
(
    SELECT (SELECT TOP <span class="hljs-number">1</span> age FROM person p WHERE p.name = per.name <span class="hljs-keyword">AND</span> p.id != per.id) <span class="hljs-keyword">AS</span> age
    FROM person per
    GROUP BY per.name, per.id
)</code></span></pre>


<p class="wp-block-paragraph">通过临时表将中间结果物化到 <code>tempdb</code> 中，后续多次引用时直接读取临时表，既减少了重复计算，也降低了 IO 开销，在复杂数据迁移场景中尤为实用。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/zh/2026/09/29/%e4%bd%bf%e7%94%a8%e4%b8%b4%e6%97%b6%e8%a1%a8%e8%bf%9b%e8%a1%8c%e6%95%b0%e6%8d%ae%e8%bf%81%e7%a7%bb%e4%b8%8e%e6%9f%a5%e8%af%a2%e4%bc%98%e5%8c%96/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
