sql 将‘1,2,3,4’转成相应的表,字段分隔表值函数,一行变多行,

再设计表的时候我们经常遇到这样的情况,字段的值为1,2,3,4 等字符隔开的情况,存的是数字,但是显示的时候是对应的类别,直接上图,清楚明了,

如何想得到
分两步完成,步骤如下:

第一步先创造 一个表值函数,将1,2,3,4 转化为

函数是从网上找来的,代码如下:

create FUNCTION [dbo].[fn_Split](

@String nvarchar (max),

@Delimiter nvarchar (10)

)

RETURNS @ValueTable TABLE ([Value] NVARCHAR(max),[id] int)

BEGIN

DECLARE @NextString nvarchar(max),

@Pos int,

@NextPos int,

@CommaCheck nvarchar(1),

@id int

set @id=1

SET @NextString = ‘‘

SET @CommaCheck = right(@String,1)

SET  @String = @String + @Delimiter

SET @Pos = CHARINDEX(@Delimiter,@String)

SET @NextPos = 1

WHILE (@pos <>  0)

BEGIN

SET @NextString = SUBSTRING(@String,1,@Pos - 1)

INSERT INTO @ValueTable ( [Value],[id]) VALUES (@NextString,@id)

SET @String = SUBSTRING(@String,@pos +1,LEN(@String))

SET @NextPos = @Pos

SET @pos  = CHARINDEX(@Delimiter,@String)

set @id = @id +1

END

RETURN

END

GO

第二步 创建标量函数  ,这步比较重要,由于这些标量函数也不经常用到,总感觉能实现就是还没想好思路,也就是多行转一行的啦,

代码如下:ALTER FUNCTION [dbo].[GetBiontionName](@nodeId varchar(64))

RETURNS varchar(64)

AS

BEGIN

declare @name varchar(64)

set @name=(select  name+‘,‘ from GWT_Biont where cast(id as varchar) in (SELECT CAST(value AS INT) FROM dbo.fn_Split(@nodeId, ‘,‘)) for xml path(‘‘) )

return  substring(@name,1,len(@name)-1)

END

GO

这样就大功搞成了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 11:30:52

sql 将‘1,2,3,4’转成相应的表,字段分隔表值函数,一行变多行,的相关文章

SQL创建字段信息(表值函数)

1 ALTER FUNCTION [dbo].[fnt_SplitString] 2 ( 3 @p1 varchar(Max), 4 @p3 varchar(255) 5 ) 6 RETURNS 7 @Table_Var TABLE 8 ( 9 c1 varchar(max) 10 ) 11 AS 12 BEGIN 13 declare @p2 varchar(max) 14 set @p2=rtrim(ltrim(@p1)) 15 declare @pos1 int 16 declare @p

sql 表值函数与标量值函数

写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的,区别是表值函数只能返回一个表,标量值函数可以返回基类型. 举个例子,当用户删除一个节点的时候,是需要将当前节点下的所有子节点都删掉,如果程序只传一个当前节点,那就需要写一个函数来得到当前节点下的所有子节点,这些子节点的信息就可以放到一个表中返回. ALTER FUNCTION testGetSubNodes ( -- Add the

用sql取出来的list需要处理成map的两种情况

1. 原生sql: select a.id,a.name from a SQLQuery sqlQuery=this.getSession().createSQLQuery(sb.toString()); List list = sqlQuery.list(); 在action处理成map: 2.hql: select new map(a.id as id,a.name as name) from a this.getHibernateTemplate().find(sb.toString())

如何让SQL Server数据库自动备份并压缩成rar文件

1.  先开启xm_cmdshell服务 xp_cmdshell 扩展存储过程将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出.由于xp_cmdshell 可以执行任何操作系统命令,所以一旦SQL Server管理员帐号(如sa)被攻破,那么攻击者就可以利用xp_cmdshell 在SQL Server中执行操作系统命令,如:创建系统管理员,也就意味着系统的最高权限已在别人的掌控之中.由于存在安全隐患,所以在SQL Server 2005中, xp_cmdshell

[MS SQL]含有上午or下午字符串转成DateTime之错误处理

前言 此篇文章标题实在很难下,所以我需要描述一下情境.因最近接手一个国外的Project,首先必须先将开发环境建置起来,但有关日期的程序写法,都是在C#将Datetime直接ToString,然后这个string直接丢到SP去处理,正式环境都跑得好好的,测试环境在DB就发生了日期转型错误的Exception. 还原&调试 在C#里,会产生出类似这种string,Response的结果会是2013/5/25 上午 00:21:25这种格式 之后这个string,会丢到SP做一些处理,这种格式就会发

sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表

USE [tms]GO/****** Object: UserDefinedFunction [dbo].[fn_StrToTable_Double] Script Date: 2017/4/26 9:07:38 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: HXQ-- Create date: 2016年8月9日18:0

SQL Server 2008从基础开始学习历程(1)------创建表与查询

[by:yy] 无论我们学什么呢,都要讲究一个Why,一个How.那么我们为什么要学SQL呢?无非就那么几点. 1.为了适应其他技术,和其他技术配对而学. 我个人的理解呢,只要在IT行业,无论你学什么,或者做什么工作.都离不开数据库.而学习数据库呢,又太文字化了,看的心里就烦.我是很抵触文字的.看着一大排一大排的字,就怕.可能是大天朝的教育所致.已经怕了学生生涯了. 2.为了适应社会而学. 随便找个招聘信息,都会有标注需要会SQL语言啊.了解MySql呀.会搞Oracle呀.所以呢,为了能在找工

SQL Server -&gt;&gt; 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表)

原文:SQL Server ->> 深入探讨SQL Server 2016新特性之 --- Temporal Table(历史表) 作为SQL Server 2016(CTP3.x)的另一个新特性,Temporal Table(历史表)记录了表历史上任何时间点所有的数据改动.Temporal Table其实早在ANSI SQL 2011就提出了,而SAP HANA, DB2和Oracle早已在它们的产品中加入/实现了这一特性.所以说微软其实是落后了几个竞争对手.既然在CTP3.0中加入了,相信

SQL 表值函数

表值函数返回的是一张表. 情况:把传入的字符串按指定分隔符转换成数组 理解:把字符串打散,逐个插入表,这个表就是需要的数据 Create Function [dbo].[Split] ( @Sql varchar(8000), @Splits varchar(10) ) returns @temp Table (a varchar(100)) As Begin Declare @i Int Set @Sql = RTrim(LTrim(@Sql)) Set @i = CharIndex(@Spl