汇图金 > 杂谈 > 正文

​SQL STUFF函数

2026-01-08 14:01 来源:网络 点击:

SQL STUFF函数

一、STUFF函数参数

STUFF ( character_expression , start , length ,character_expression )

character_expression 可以是常量、变量也可以是字符列或二进制数据列.

start 一个整数值,指定删除和插入的开始位置,如果start 或 length 为负,则返回空字符串.

length 一个整数值,指定要删除的字符数,如果 length 比第一个 character_expression 长,则最多 删除到最后一个character_expression 中的最后一个字符.length 可以是 bigint 类型.

返回类型 如果 character_expression 是受支持的字符数据类型,则返回字符数据; 如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据.

备注

如果开始位置或长度值是负数或开始位置大于第一个字符串的长度,将返回空字符串; 如果删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符.
如果结果值大于返回类型支持的最大值,则产生错误.

二、示例一 在第一个字符串helloword 中删除从第 2 个位置(字符 e)开始的第三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串.

SELECT STUFF('helloword', 2, 3, 'china')

运行结果:hchinaoword

三、示例二 将表中多行字段内容串联起来,用逗号分隔

STUFF(select ',' + fieldname from tablename for xml path('')),1,1,'') fieldname
-----------
EE
FF GG

运行结果:EE,FF,GG for xml path是SQL Server 2005以后版本支持的一种生成XML的方式, stuff函数的作用是去掉字符串最前面的逗号分隔符.

select *,STUFF(select ',' + fieldname from table1 for xml path('')),1,1,'') as field from table2

******************************************************************************************************* 例:

select distinct Q.* ,

MOCTA.TA026+MOCTA.TA027+MOCTA.TA028 as 订单单别单号,

MOCTA.TA001+SFCTA.TA002 as 工单单号,

MOCTA.UDF05 as 客户,

MOCTA.UDF04 as 计划属性,

MOCTA.UDF01 as 令号,

MOCTA.TA035 as 图号,

MOCTA.TA034 as 名称,

MOCTA.TA015 as 预计数量,

MOCTA.TA018 as 报废数量,

MOCTA.TA060 as 破坏数量,

MOCTA.TA017 as 已生成量,

MOCTA.TA010 as 预交货日,

(CASE WHEN MOCTA.TA011 ='Y' THEN '完工'

WHEN MOCTA.TA011='y' THEN '完工'

ELSE '未完工' END) as 产品状态

from (select TASKID,stuff ((SELECT ','+K.CMSMWMW002 FROM (

SELECT MOCTA.TA026+MOCTA.TA027+MOCTA.TA028 as ORDERID, --订单单别单号

MOCTA.TA001+SFCTA.TA002 as TASKID, --工单单号

MOCTA.UDF05 as MOCTAUDF05, --客户

MOCTA.UDF04 as MOCTAUDF04, --计划属性

MOCTA.UDF01 as MOCTAUDF01, --令号

MOCTA.TA035 as MOCTATA035, --图号

MOCTA.TA034 as MOCTATA034, --名称

MOCTA.TA015 as MOCTATA015, --预计产量

MOCTA.TA018 as MOCTATA018, --报废数量

MOCTA.TA060 as MOCTATA060, --破坏数量

MOCTA.TA017 as MOCTATA017, --已生产量

MOCTA.TA010 as MOCTATA010, --预交货日

(CASE WHEN MOCTA.TA011 ='Y' THEN '完工'

WHEN MOCTA.TA011='y' THEN '完工'

ELSE '未完工' END) as MOCTATA011, --产品状态

CMSMW.MW002 as CMSMWMW002 --工艺

FROM MOCTA as MOCTA

Left JOIN SFCTA as SFCTA On MOCTA.TA001=SFCTA.TA001 and MOCTA.TA002=SFCTA.TA002

Left JOIN COPTC as COPTC On COPTC.TC001=MOCTA.TA026 and COPTC.TC002=MOCTA.TA027

Left JOIN CMSMW as CMSMW On CMSMW.MW001=SFCTA.TA004

WHERE MOCTA.TA011 NOT IN ('y','Y'))AS K

where K.TASKID=L.TASKID for xml path ('')),1,1,'')as 工艺名称

from (SELECT MOCTA.TA026+MOCTA.TA027+MOCTA.TA028 as ORDERID,

MOCTA.TA001+SFCTA.TA002 as TASKID,

MOCTA.UDF05 as MOCTAUDF05,

MOCTA.UDF04 as MOCTAUDF04,

MOCTA.UDF01 as MOCTAUDF01,

MOCTA.TA035 as MOCTATA035,

MOCTA.TA034 as MOCTATA034,

MOCTA.TA015 as MOCTATA015,

MOCTA.TA018 as MOCTATA018,

MOCTA.TA060 as MOCTATA060,

MOCTA.TA017 as MOCTATA017,

MOCTA.TA010 as MOCTATA010,

(CASE WHEN MOCTA.TA011 ='Y' THEN '完工'

WHEN MOCTA.TA011='y' THEN '完工'

ELSE '未完工' END) as MOCTATA011,

CMSMW.MW002 as CMSMWMW002

FROM MOCTA as MOCTA

Left JOIN SFCTA as SFCTA On MOCTA.TA001=SFCTA.TA001 and MOCTA.TA002=SFCTA.TA002

Left JOIN COPTC as COPTC On COPTC.TC001=MOCTA.TA026 and COPTC.TC002=MOCTA.TA027

Left JOIN CMSMW as CMSMW On CMSMW.MW001=SFCTA.TA004 WHERE MOCTA.TA011 NOT IN ('y','Y') ) as L)as Q

left join MOCTA as MOCTA on Q.TASKID=MOCTA.TA001+MOCTA.TA002

Left JOIN SFCTA as SFCTA On MOCTA.TA001=SFCTA.TA001 and MOCTA.TA002=SFCTA.TA002

Left JOIN COPTC as COPTC On COPTC.TC001=MOCTA.TA026 and COPTC.TC002=MOCTA.TA027

Left JOIN CMSMW as CMSMW On CMSMW.MW001=SFCTA.TA004

where (MOCTA.TA003 >= '20200720')

运行结果: