<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sql on 冯威的博客</title><link>https://fwhyy.com/tags/sql/</link><description>Recent content in Sql on 冯威的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Tue, 19 Mar 2013 00:00:00 +0800</lastBuildDate><atom:link href="https://fwhyy.com/tags/sql/atom.xml" rel="self" type="application/rss+xml"/><item><title>SQL查询-将列转换成字符串（for xml path）</title><link>https://fwhyy.com/2013/03/sql-query-for-xml-path/</link><pubDate>Tue, 19 Mar 2013 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2013/03/sql-query-for-xml-path/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;最近做一报表，因为查询的SQL很长很复杂，导致直接查询出现异常，后来想到将大量重复的只是查询条件不同的子查询放到函数中去做，无奈需要的参数不能传进函数中，因为参数格式类似如：&amp;lsquo;ProjGUID1&amp;rsquo;,&amp;lsquo;ProjGUID2&amp;rsquo; 这样，这是报表工具生成的，无法修改。现在就要想办法让参数能传进函数中或是换用其他的方式。&lt;/p&gt;
&lt;h2 id="思路"&gt;思路&lt;/h2&gt;
&lt;p&gt;1、首先想到的是用存储过程，但是在报表工具中调试不通，存储过程不能得到有效的执行，可能是根本就不支持存储过程；&lt;/p&gt;
&lt;p&gt;2、将参数作为in的条件，查询出符合条件的GUID，返回的是一个表，然后循环表的行记录，拼接GUID传入函数，但是报表工具中的SQL不支持定义变量和临时表，此方法也行不通；&lt;/p&gt;
&lt;p&gt;3、利用SQL语句的For Xml 将GUID查询成一个XML结构的字符串，但传入函数中后解析该XML需要用到系统存储过程sp_xml_preparedocument ，函数中并不支持调用存储过程，此路也不通。关于SQL中解析XML可以参见我之前的博文《&lt;a href="http://blog.fwhyy.com/2011/07/use-sp_xml_preparedocument-processing-xml-documents/"&gt;使用sp_xml_preparedocument处理XML文档&lt;/a&gt;》。&lt;/p&gt;
&lt;h2 id="解决方法"&gt;解决方法&lt;/h2&gt;
&lt;p&gt;上面说到了SQL的For Xml可以将查询的列转换成XML结构的字符串，还有一种方法可以将查询的字段转换成以特定符号隔开的字符串，那就是For Xml Path：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT TOP 2 CONVERT(VARCHAR(40),ProjGUID)+&amp;#39;,&amp;#39; FROM p_Project FOR XML PATH(&amp;#39;&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的语句得到的结果如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;BAA95B67-FC41-4A78-AF1C-014BBE0AC368,37641496-23AA-46CB-9817-027AA120F5C6,
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;至此问题解决，这样的字符串是可以传进函数的，只需将最后的逗号去掉即可。&lt;/p&gt;</description></item><item><title>在SQL查询中使用LIKE来代替IN</title><link>https://fwhyy.com/2011/08/in-the-sql-query-using-the-like-instead-of-the-in/</link><pubDate>Sat, 13 Aug 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/08/in-the-sql-query-using-the-like-instead-of-the-in/</guid><description>&lt;p&gt;在SQL查询中根据已知ID的集合来查询结果我们通常会用到IN，直接在IN后面给出ID的集合或是在IN后面跟一个子查询。如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT * FROM Orders
WHERE OrderGUID IN(&amp;#39;BC71D821-9E25-47DA-BF5E-009822A3FC1D&amp;#39;,&amp;#39;F2212304-51D4-42C9-AD35-5586A822258E&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以看出直接在IN后面跟ID的集合需要将每一个ID都用单引号引起来。在实际应用中会遇到这么一种情况，在界面中收集的是一串GUID的拼接字符串，中间以逗号隔开，如果作为参数传到一个存储过程中执行，最终生成的语句会是下面这样：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT * FROM Orders
WHERE OrderGUID IN(&amp;#39;BC71D821-9E25-47DA-BF5E-009822A3FC1D,F2212304-51D4-42C9-AD35-5586A822258E&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这样就不能查询到正确的结果。&lt;/p&gt;
&lt;p&gt;一般情况下我们解决此问题的思路是将传入的字符串用一个split函数来处理，最终处理的结果是一张表，然后将这个表做自查询即可，如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DECLARE @IDs VARCHAR(4000)
SET @IDs=&amp;#39;BC71D821-9E25-47DA-BF5E-009822A3FC1D,F2212304-51D4-42C9-AD35-5586A822258E&amp;#39;
DECLARE @temp TABLE(str VARCHAR(50))
INSERT INTO @temp
SELECT * FROM dbo.Split(@IDs,&amp;#39;,&amp;#39;)
SELECT * FROM Orders WHERE OrderGUID IN (SELECT str FROM @temp)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;当然split函数系统比不提供，需要我们自己写：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE FUNCTION Split
(
 @SourceSql varchar(8000),
 @StrSeprate varchar(10)
)
RETURNS @temp TABLE(F1 VARCHAR(100))
AS
BEGIN
 DECLARE @i INT
 SET @SourceSql=rtrim(ltrim(@SourceSql))
 SET @i=charindex(@StrSeprate,@SourceSql)
 WHILE @i&amp;gt;=1
 BEGIN
 INSERT @temp VALUES(left(@SourceSql,@i-1))
 SET @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
 SET @i=charindex(@StrSeprate,@SourceSql)
 END
 IF @SourceSql&amp;lt;&amp;gt;&amp;#39;&amp;#39;
 INSERT @temp VALUES(@SourceSql)
 RETURN
END
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;像这样做非常麻烦，而且还需要借助函数来实现，下面介绍一种简单的方法，因为GUID是唯一的，所以在上面的例子中可以使用LIKE来代替IN也可以达到同样的查询效果：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT * FROM Orders
WHERE &amp;#39;BC71D821-9E25-47DA-BF5E-009822A3FC1D,F2212304-51D4-42C9-AD35-5586A822258E&amp;#39;
LIKE &amp;#39;%&amp;#39;+convert(VARCHAR(40),OrderGUID)+&amp;#39;%&amp;#39;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>SqlServer表死锁的解决方法</title><link>https://fwhyy.com/2011/08/essentially-a-table-of-deadlock-solution/</link><pubDate>Sat, 06 Aug 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/08/essentially-a-table-of-deadlock-solution/</guid><description>&lt;p&gt;前些天写一个存储过程，存储过程中使用了事务，后来我把一些代码注释掉来进行调试找错，突然发现一张表被锁住了，原来是创建事务的代码忘记注释掉。本文表锁住了的解决方法。&lt;/p&gt;
&lt;p&gt;其实不光是上面描述的情况会锁住表，还有很多种场景会使表放生死锁，解锁其实很简单，下面用一个示例来讲解：&lt;/p&gt;
&lt;p&gt;1 首先创建一个测试用的表：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE TABLE Test
(
 TID INT IDENTITY(1,1)
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2 执行下面的SQL语句将此表锁住：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT * FROM Test WITH (TABLOCKX)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3 通过下面的语句可以查看当前库中有哪些表是发生死锁的：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT request_session_id spid,OBJECT_NAME(resource_associated_entity_id)tableName
FROM sys.dm_tran_locks
WHERE resource_type=&amp;#39;OBJECT &amp;#39; 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4 上面语句执行结果如下：&lt;/p&gt;
&lt;p&gt;spid ：被锁进程ID。
tableName：发生死锁的表名。
5 只需要使用kill关键字来杀掉被锁的进程ID就可以对表进行解锁：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;KILL 52
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>使用sp_xml_preparedocument处理XML文档</title><link>https://fwhyy.com/2011/07/use-sp-xml-preparedocument-processing-xml-documents/</link><pubDate>Sat, 23 Jul 2011 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2011/07/use-sp-xml-preparedocument-processing-xml-documents/</guid><description>&lt;p&gt;有时会在存储过程中处理一些XML格式的数据，所以会用到sp_xml_preparedocument，他可以将XML数据进行读取，然后使用 MSXML 分析器 (Msxmlsql.dll) 对其进行分析。我们就可以很容易的在存储过程中得到XML中我们想要的数据。下面的代码就是使用sp_xml_preparedocument读取XML：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc =&amp;#39;
&amp;lt;ROOT&amp;gt;
&amp;lt;Customer CustomerID=&amp;#34;VINET&amp;#34; ContactName=&amp;#34;Paul Henriot&amp;#34;&amp;gt;
 &amp;lt;Order CustomerID=&amp;#34;VINET&amp;#34; EmployeeID=&amp;#34;5&amp;#34; OrderDate=&amp;#34;1996-07-04T00:00:00&amp;#34;&amp;gt;
 &amp;lt;OrderDetail OrderID=&amp;#34;10248&amp;#34; ProductID=&amp;#34;11&amp;#34; Quantity=&amp;#34;12&amp;#34;/&amp;gt;
 &amp;lt;OrderDetail OrderID=&amp;#34;10248&amp;#34; ProductID=&amp;#34;42&amp;#34; Quantity=&amp;#34;10&amp;#34;/&amp;gt;
 &amp;lt;/Order&amp;gt;
&amp;lt;/Customer&amp;gt;
&amp;lt;Customer CustomerID=&amp;#34;LILAS&amp;#34; ContactName=&amp;#34;Carlos Gonzlez&amp;#34;&amp;gt;
 &amp;lt;Order CustomerID=&amp;#34;LILAS&amp;#34; EmployeeID=&amp;#34;3&amp;#34; OrderDate=&amp;#34;1996-08-16T00:00:00&amp;#34;&amp;gt;
 &amp;lt;OrderDetail OrderID=&amp;#34;10283&amp;#34; ProductID=&amp;#34;72&amp;#34; Quantity=&amp;#34;3&amp;#34;/&amp;gt;
 &amp;lt;/Order&amp;gt;
&amp;lt;/Customer&amp;gt;
&amp;lt;/ROOT&amp;gt;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
上面只是读取了XML，要想获取XML数据还需要使用OPENXML，代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SELECT *
FROM openxml(@hdoc,&amp;#39;/ROOT/Customer&amp;#39;,1)
WITH (CustomerID VARCHAR(40),ContactName VARCHAR(40)) 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OPENXML有三个参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一个是sp_xml_preparedocument读取是的OUTPUT参数，在本示例中就是@hdoc；&lt;/li&gt;
&lt;li&gt;第二个是一个XPath表达式，用来获取指定位置的数据；&lt;/li&gt;
&lt;li&gt;第三个是一个可选项，用来表示获取的方式，有0,1,2,8四种取值，详细解释&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms186918.aspx"&gt;请看&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FROM后面的WITH也是可选的，用来指定获取哪些数据字段，上面代码中只取了CustomerID和ContactName。上面的查询结果如下：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;CustomerID&lt;/th&gt;
					&lt;th&gt;ContactName&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;LILAS&lt;/td&gt;
					&lt;td&gt;Carlos Gonzlez&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果不指定WITH子句，查询出来的是一个默认的表结构，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://img.fwhyy.com/2011/2011-07-23_114701.webp" alt="2011-07-23_114701" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;表格列的解释说明：&lt;/p&gt;
&lt;p&gt;在WITH子句中,我们还可以通过设置来获取父级元素的属性值:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;DECLARE @hdoc int
DECLARE @doc varchar(1000)
SET @doc =&amp;#39;
&amp;lt;ROOT&amp;gt;
&amp;lt;Customer CustomerID=&amp;#34;VINET&amp;#34; ContactName=&amp;#34;Paul Henriot&amp;#34;&amp;gt;
 &amp;lt;Order OrderID=&amp;#34;10248&amp;#34; CustomerID=&amp;#34;VINET&amp;#34; EmployeeID=&amp;#34;5&amp;#34;
 OrderDate=&amp;#34;1996-07-04T00:00:00&amp;#34;&amp;gt;
 &amp;lt;OrderDetail ProductID=&amp;#34;11&amp;#34; Quantity=&amp;#34;12&amp;#34;/&amp;gt;
 &amp;lt;OrderDetail ProductID=&amp;#34;42&amp;#34; Quantity=&amp;#34;10&amp;#34;/&amp;gt;
 &amp;lt;/Order&amp;gt;
&amp;lt;/Customer&amp;gt;
&amp;lt;Customer CustomerID=&amp;#34;LILAS&amp;#34; ContactName=&amp;#34;Carlos Gonzlez&amp;#34;&amp;gt;
 &amp;lt;Order OrderID=&amp;#34;10283&amp;#34; CustomerID=&amp;#34;LILAS&amp;#34; EmployeeID=&amp;#34;3&amp;#34;
 OrderDate=&amp;#34;1996-08-16T00:00:00&amp;#34;&amp;gt;
 &amp;lt;OrderDetail ProductID=&amp;#34;72&amp;#34; Quantity=&amp;#34;3&amp;#34;/&amp;gt;
 &amp;lt;/Order&amp;gt;
&amp;lt;/Customer&amp;gt;
&amp;lt;/ROOT&amp;gt;&amp;#39;

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc
SELECT *
FROM OPENXML (@hdoc, &amp;#39;/ROOT/Customer/Order/OrderDetail&amp;#39;,2)
 WITH (OrderID int &amp;#39;../@OrderID&amp;#39;,
 CustomerID varchar(10) &amp;#39;../@CustomerID&amp;#39;,
 OrderDate datetime &amp;#39;../@OrderDate&amp;#39;,
 ProdID int &amp;#39;@ProductID&amp;#39;,
 Qty int &amp;#39;@Quantity&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;查询的结果为:&lt;/p&gt;</description></item><item><title>SqlServer数据库的语句及一些操作整理</title><link>https://fwhyy.com/2010/02/some-tips-of-sqlserver/</link><pubDate>Tue, 02 Feb 2010 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2010/02/some-tips-of-sqlserver/</guid><description>&lt;p&gt;临近年终，在工作之余对工作和学习中遇到的问题以及常用的一些知识点做了些整理，以备后用。本文涉及的内容为数据库,算是对开发总结(1)—数据库一文的补充。&lt;/p&gt;
&lt;p&gt;1 对于主键设置了Identity的表，在删除表中数据后再往表中插入数据，Identity列不是从1起始了，如果想删除数据后Indentity列仍从1起始，可以用下面代码来删除数据。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;truncate table tablename
DBCC CHECKIDENT(tablename,RESEED,1)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;2 判断指定表在数据库中是否存在&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;if exists(select name from sysobjects where name=&amp;#39;tablename&amp;#39; and type=&amp;#39;u&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;3 判断指定列在指定表中是否存在&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;if exists(select * from sys.columns,sys.tables
 where sys.columns.object_id = sys.tables.object_id
 and sys.tables.name=&amp;#39;tablename&amp;#39; and sys.columns.[name]=&amp;#39;columnname&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;4 在编写代码生成器之类的程序的时候，通常需要取出数据库中所有的表名以及表中字段的一些基本信息，如字段长度、字段类型、描述等。实现上面要求的sql语句如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;--取数据库中表的集合
select * from sysobjects where xtype=&amp;#39;u&amp;#39; order by name

--取表中字段的一些基本信息
select
 sys.columns.name, --字段名
 sys.types.name as typename, --字段类型
 sys.columns.max_length, --字段长度
 sys.columns.is_nullable, --是否可空
 (select
 count(*)
 from
 sys.identity_columns
 where
 sys.identity_columns.object_id = sys.columns.object_id
 and
 sys.columns.column_id = sys.identity_columns.column_id
 ) as is_identity ,--是否自增

 (select
 value
 from
 sys.extended_properties
 where
 sys.extended_properties.major_id = sys.columns.object_id
 and
 sys.extended_properties.minor_id = sys.columns.column_id
 ) as description --注释
from
 sys.columns, sys.tables, sys.types
where
 sys.columns.object_id = sys.tables.object_id
and
 sys.columns.system_type_id=sys.types.system_type_id
and
 sys.tables.name=&amp;#39;tablename&amp;#39;
order by sys.columns.column_id
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;5 在存储过程中使用事务&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;create procedure procname
as
begin tran
 --执行sql语句

if @@ERROR!=0
begin
 rollback tran --失败
end
else
begin
 commit tran --成功
end 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;6 清除数据库日志&lt;/p&gt;</description></item><item><title>在数据库中将字表中的多行合并到一列中</title><link>https://fwhyy.com/2009/10/words-in-the-table-in-the-database-multi-line-merged-into-a-column/</link><pubDate>Thu, 15 Oct 2009 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2009/10/words-in-the-table-in-the-database-multi-line-merged-into-a-column/</guid><description>&lt;p&gt;几年前就做过这样的查询，在最近的项目中又遇到这样的需求，在此记录一下。&lt;/p&gt;
&lt;p&gt;假设有一个文章表Post和一个评论表Comments，可以对文章进行多次评论，现在希望在对Post表查询时能将Post的所有评论内容组合到一个字段中显示。&lt;/p&gt;
&lt;p&gt;首先创建表Post和Comments&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;create table Post
(
 [PostID] int identity(1,1) primary key not null,
 [Title] nvarchar(50),
 [Content] text,
 [CreateDate] datetime default getdate()
)

create table Comments
(
 [CommentID] int identity(1,1) primary key not null,
 [PostID] int,
 [Content] text,
 [CreateDate] datetime default getdate()
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;给这两个表添加一些测试数据&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;insert into Post select &amp;#39;钓鱼岛是中国的吗？&amp;#39;,&amp;#39;钓鱼岛是中国的&amp;#39;,getdate()
insert into Comments select 1,&amp;#39;绝对是&amp;#39;,getdate()
insert into Comments select 1,&amp;#39;必须是的&amp;#39;,getdate()
insert into Comments select 1,&amp;#39;谁说不是呢&amp;#39;,getdate()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;评论内容的组合使用一个函数来实现，在函数中使用游标去遍历给定PostID的所有评论然后进行拼接，函数代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;create FUNCTION fn_GetAllComments(@PostID int)
RETURNS NVARCHAR(4000)
AS
BEGIN
 DECLARE @result VARCHAR(4000)
 SET @result=&amp;#39;&amp;#39;
 DECLARE getAllComments CURSOR
 FOR
 select CommentID from Comments where PostID=@PostID
 OPEN getAllComments
 DECLARE @ID SYSNAME
 FETCH FROM getAllComments INTO @ID
 WHILE @@fetch_status=0
 BEGIN
 SET @result=@result+(select convert(nvarchar(20),CreateDate,120)
 from Comments where CommentID=@ID)+&amp;#39;:&amp;#39;+
 (select cast([Content] as nvarchar(4000))
 from Comments where CommentID=@ID)+&amp;#39;；&amp;#39;
 FETCH FROM getAllComments INTO @ID
 END
 CLOSE getAllComments
 SET @result= substring(@result,0,len(@result))
 DEALLOCATE getAllComments
 RETURN @result
END
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;现在写SQL语句来测试一下结果&lt;/p&gt;</description></item><item><title>SQL 计算一個字符串在另一个字符串中出現的次数</title><link>https://fwhyy.com/2008/08/sql-to-calculate-a-string-in-the-number-of-occurrences-of-another-string/</link><pubDate>Wed, 06 Aug 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/08/sql-to-calculate-a-string-in-the-number-of-occurrences-of-another-string/</guid><description>&lt;p&gt;在sqlserver中來計算一個字符串在另一個字符串中出現的次數，通常會去用循環來匹配，然後計算出出現的次數，這樣的效能不是很高。現在講一種比較簡單的方法也能實現同樣的功能，思路如下：&lt;/p&gt;</description></item><item><title>开发总结—数据库篇</title><link>https://fwhyy.com/2008/08/summary-the-database-development/</link><pubDate>Wed, 06 Aug 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/08/summary-the-database-development/</guid><description>&lt;p&gt;本文是我在平时工作中所遇到的数据库方面的一些知识总结&lt;/p&gt;</description></item><item><title>Sql中分隔字串–&gt;查询–&gt;组合字串</title><link>https://fwhyy.com/2008/03/separate-strings-in-sql/</link><pubDate>Tue, 18 Mar 2008 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2008/03/separate-strings-in-sql/</guid><description>&lt;p&gt;最近在工作遇到一个数据库查询的问题，大概如下:表Table1中有字段No和Title，每一个No对应一个Title，表Table2中有NoAll字段，NoAll字段的value是No的组合，以逗号隔开，如”111,222,333″，现在要查询Table2，根据NoAll将其中的每一个No所对应的Title查询出来也以逗号分隔显示，如：”oec2003,oec2004,oec2004″。表定义如下：&lt;/p&gt;</description></item><item><title>解决sqlserver2005数据库sa登录问题</title><link>https://fwhyy.com/2007/12/solve-the-problem-of-sqlserver2005-database-sa-login/</link><pubDate>Sun, 02 Dec 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/12/solve-the-problem-of-sqlserver2005-database-sa-login/</guid><description>&lt;p&gt;如果安装sql server 2005的时候，设置的身份验证模式为”windows”(默认), 安装完成后, 再设置为”sql server和windows”的身份验证模式, 则sa用户是被禁用的。必须启用它。&lt;/p&gt;</description></item><item><title>存储过程生成流水号</title><link>https://fwhyy.com/2007/10/stored-procedure-to-generate-a-serial-number/</link><pubDate>Wed, 31 Oct 2007 00:00:00 +0800</pubDate><guid>https://fwhyy.com/2007/10/stored-procedure-to-generate-a-serial-number/</guid><description>&lt;h2 id="首先在数据库中创建一个存放流水号的表"&gt;首先在数据库中创建一个存放流水号的表&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE TABLE [dbo].[NumSeq] (
 [Cate] [varchar] (2) NOT NULL ,
 [DateNo] [varchar] (4) NOT NULL ,
 [Seq] [int] NULL ,
 [CrTime] [datetime] NOT NULL
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;上面的代码中，Cate 字段为流水号的头，可以在下面的存储过程中用参数的方式传入，我的定义是2个字符，这个可以根据具体需要更改&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DateNo 字段为获取日期信息&lt;/li&gt;
&lt;li&gt;Seq 字段为流水号，但最终生成的流水号是这三个字段的相加&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="创建存储过程"&gt;创建存储过程&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE PROC dpPMT_SGetMaintainSeq
@MaintainCate VARCHAR(2)

AS
--***********************累加编号*************************************************
DECLARE @MaintainNo VARCHAR(12)
IF NOT EXISTS(SELECT
 *
 FROM
 NumSeq
 WHERE
 Cate=@MaintainCate AND DATEDIFF(DAY,CrTime,GETDATE())=0)
 BEGIN
 INSERT INTO
 NumSeq(Cate,DateNo,Seq)
 values(@MaintainCate,RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+
 REPLICATE(&amp;#39;0&amp;#39;,2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())),0)

 END
ELSE
 BEGIN
 UPDATE
 NumSeq
 SET
 Seq=Seq+1
 WHERE
 Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+
 REPLICATE(&amp;#39;0&amp;#39;,2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))
 END

--************************组合编号***************************************************************
SELECT
 @MaintainNo=Cate+DateNo+REPLICATE(&amp;#39;0&amp;#39;,6-LEN(Seq))+CONVERT(VARCHAR(6),Seq)
FROM
 NumSeq
WHERE
 Cate=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+
 REPLICATE(&amp;#39;0&amp;#39;,2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE()))

SELECT @MaintainNo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个存储过程最终输出的结果如：AA071031000001 前面两位是传入的参数，中间四位是年份的后两位和月，最后的六位为6位数字的流水号。您也可以修改上面的存储过程来生成符合您要求的流水号&lt;/p&gt;</description></item></channel></rss>