将所有符合条件的结果拼接成一列并用逗号隔开的一个sql语句
前端之家收集整理的这篇文章主要介绍了
将所有符合条件的结果拼接成一列并用逗号隔开的一个sql语句,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
<div class="codetitle"><a style="CURSOR: pointer" data="15891" class="copybut" id="copybut15891" onclick="doCopy('code15891')"> 代码如下:
<div class="codebody" id="code15891">
create table tb(id int,value varchar(10))
insert into tb values(1,'aa')
insert into tb values(1,'bb')
insert into tb values(2,'aaa')
insert into tb values(2,'bbb')
insert into tb values(2,'ccc')
go
create function [dbo].[f_str](@id int) returns nvarchar(1000)
as
begin
declare @str nvarchar(1000)
set @str = ''
select @str = @str + ',' + cast(value as nvarchar(900)) from tb where id = @id
set @str = right(@str,len(@str) - 1)
return @str
end
go
--
调用函数 select id,value = dbo.f_str(id) from tb group by id
运行结果:
本来在上面的
函数中所有的nvarchar都是varchar类型的,并且上面
函数的红色处在
调用cast
方法时,并未指定长度。朋友测试后发现,结果会在30个字符 时截断,原来以为是varchar和nvarchar的区别,我试着将varchar改成了nvarchar,朋友测试的结果是在54个字符处截断。我查了下,是varchar的默认长度问题,见
sql server联机丛书中下面的说明:
char 和 varchar
固定长度 (char) 或可变长度 (varchar) 字符数据类型。 char[(n)] 长度为 n 个字节的固定长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为 n 个字节。char 在
sql-92 中的同义词为 character。 varchar[(n)] 长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在
sql-92 中的同义词为 char varying 或 character varying。 注释
如果没有在数据定义或变量声明语句中指定 n,则默认长度为 1。如果没有使用 CAST
函数指定 n,则默认长度为 30。 将为使用 char 或 varchar 的对象被指派
数据库的默认排序规则,除非用 COLLATE 子句另外指派了特定的排序规则。该排序规则控制用于存储字符数据的
代码页。
支持多语言的
站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题。如果使用 char 或 varchar: 如果希望列中的数据值大小接近一致,请使用 char。
如果希望列中的数据值大小显著不同,请使用 varchar。
如果执行 CREATE TABLE 或 ALTER TABLE 时 SET ANSI_PADDING 为 OFF,则一个定义为 NULL 的 char 列将被作为 varchar 处理。 当排序规则
代码页使用双字节字符时,存储大小仍然为 n 个字节。根据字符串的不同,n 个字节的存储大小可能小于 n 个字符。