--将一组查询结果按指定分隔符拼接到一个变量中

--将一组查询结果按指定分隔符拼接到一个变量中
DECLARE @Datebases varchar(max)
SET @Datebases = STUFF((
        SELECT ','+name
        FROM sys.databases
        ORDER BY name
        FOR XML PATH('')),1,1,'')
SELECT @Datebases

 

自己验证如下:


----
/*
  建立销售信息表 主键为销售信息单号
*/
IF exists (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[SplitTable_Sale_Info]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[SplitTable_Sale_Info]
Go
CREATE TABLE SplitTable_Sale_Info
( Sale_Info_No  VARCHAR(10)  PRIMARY KEY
  ,Sale_Product_Id  VARCHAR(10) Not NULL
)
Go
/*
  建立销售担当表 主键为销售员编号
  一个销售信息单号可能由多个销售员卖出的,此处用销售单据做外键
  序号表示一个销售单据有多少个销售员卖的
*/
if exists (SELECT * FROM sysobjects WHERE id = object_id(N'[dbo].[SplitTable_Sale_User_Info]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [dbo].[SplitTable_Sale_User_Info]
Go
CREATE TABLE SplitTable_Sale_User_Info
( Sale_User_Id VARCHAR(10) PRIMARY KEY
 ,Sale_User_Number  INT 
    ,Sale_Info_No VARCHAR(10) ---FOREIGN KEY(Sale_Info_No) REFERENCES SplitTable_Sale_Info(Sale_Info_No)
)
GO
TRUNCATE TABLE SplitTable_Sale_User_Info;
TRUNCATE TABLE SplitTable_Sale_Info;
Go  ----SELECT * FROM SplitTable_Sale_User_Info
INSERT INTO SplitTable_Sale_Info
SELECT 'SIN_000001','PRC000A'
UNION ALL
SELECT 'SIN_000002','PRC000B'
UNION ALL
SELECT 'SIN_000003','PRC000C'

INSERT INTO SplitTable_Sale_User_Info
SELECT 'Him',1,'SIN_000001'
UNION ALL
SELECT 'TOM',2,'SIN_000001'
UNION ALL
SELECT 'Jerry',3,'SIN_000001'
UNION ALL
SELECT 'Temi',1,'SIN_000002'
UNION ALL
SELECT 'Milin',1,'SIN_000003'

----------------
SELECT * FROM SplitTable_Sale_Info
SELECT * FROM SplitTable_Sale_User_Info

-----------------
--要求 取出销售单据为SIN_0000001的所有信息
--方式一
SELECT A.Sale_Info_No,A.Sale_Product_Id,B.Sale_User_Id
FROM  SplitTable_Sale_Info AS A JOIN SplitTable_Sale_User_Info  AS B
ON A.Sale_Info_No = B.Sale_Info_No
WHERE A.Sale_Info_No = 'SIN_000001'
----------方式一结果
Sale_Info_No Sale_Product_Id Sale_User_Id
------------ --------------- ------------
SIN_000001   PRC000A         Him
SIN_000001   PRC000A         Jerry
SIN_000001   PRC000A         TOM

(3 行受影响)

--方式二
 SELECT  DISTINCT A.Sale_Info_No,A.Sale_Product_Id
  ,Sale_User_Id
   = STUFF((
   SELECT ','+B.Sale_User_Id
   FROM  SplitTable_Sale_Info AS A JOIN SplitTable_Sale_User_Info  AS B
   ON A.Sale_Info_No = B.Sale_Info_No
   WHERE A.Sale_Info_No = 'SIN_000001'
   ORDER BY B.Sale_User_Id
   FOR XML PATH('')),1,1,'')
FROM     SplitTable_Sale_Info AS A LEFT OUTER JOIN SplitTable_Sale_User_Info  AS B
   ON A.Sale_Info_No = B.Sale_Info_No
   WHERE A.Sale_Info_No = 'SIN_000001'
------------方式二结果
Sale_Info_No Sale_Product_Id Sale_User_Id
------------ --------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SIN_000001   PRC000A         Him,Jerry,TOM

(1 行受影响)

---方式三 若只想要销售担当名字如下即可:
 SELECT Sale_User_Id= STUFF((
   SELECT ','+B.Sale_User_Id
   FROM  SplitTable_Sale_Info AS A JOIN SplitTable_Sale_User_Info  AS B
   ON A.Sale_Info_No = B.Sale_Info_No
   WHERE A.Sale_Info_No = 'SIN_000001'
   ORDER BY B.Sale_User_Id
   FOR XML PATH('')),1,1,'')

------------方式三结果
 Sale_User_Id
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Him,Jerry,TOM

(1 行受影响)
-------------------
总结:
本来是想说明利用方式三的简便性,不过方式三只能列出一个字段,无法列出对应的销售单据等其他字段,只能操作利用方式二了。
其中方式二还只能用到DISTINCT

 

谁用更好方法可以推荐下

 

 

 

---------------------------------------------------


补充:
方式四:

 

CREATE FUNCTION dbo.Func_Get_Sale_User_Info_String(@Sale_No VARCHAR(10))
RETURNS VARCHAR(8000) 
AS
BEGIN


 DECLARE @String VARCHAR(8000)


 SET @String = ''


 SELECT @String = @String + ',' + rtrim(IsNull(Sale_User_Id,''))
 FROM   SplitTable_Sale_User_Info
 WHERE  Sale_Info_No = @Sale_No
 RETURN(stuff(@String,1,1,''))


END


Go


SELECT A.Sale_Info_No,A.Sale_Product_Id,
    dbo.Func_Get_Sale_User_Info_String('SIN_000001') AS Sale_User_Info
FROM   SplitTable_Sale_Info AS A JOIN SplitTable_Sale_User_Info  AS B
          ON A.Sale_Info_No = B.Sale_Info_No
          WHERE A.Sale_Info_No = 'SIN_000001'
          ORDER BY B.Sale_User_Id

 

 

 

需要注意的是,倘若分隔符为“;”或者字符串值中包含XML特殊字符(比如&、<、>等等),以上方法可能会无法处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值