Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询-将结果连接成一个字符串_Sql_Sql Server_Tsql_Sql Function - Fatal编程技术网

SQL查询-将结果连接成一个字符串

SQL查询-将结果连接成一个字符串,sql,sql-server,tsql,sql-function,Sql,Sql Server,Tsql,Sql Function,我有一个sql函数,其中包含以下代码: DECLARE @CodeNameString varchar(100) SELECT CodeName FROM AccountCodes ORDER BY Sort 我需要将select查询中的所有结果连接到CodeNameString中 显然,C代码中的Frach循环可以做到这一点,但如何在SQL中实现呢?< P> @ AlexanderMP的答案是正确的,但是您也可以考虑用合并来处理空值: DECLARE @CodeNameString var

我有一个sql函数,其中包含以下代码:

DECLARE @CodeNameString varchar(100)

SELECT CodeName FROM AccountCodes ORDER BY Sort
我需要将select查询中的所有结果连接到CodeNameString中


显然,C代码中的Frach循环可以做到这一点,但如何在SQL中实现呢?

< P> @ AlexanderMP的答案是正确的,但是您也可以考虑用合并来处理空值:

DECLARE @CodeNameString varchar(max)
SET @CodeNameString=''

SELECT @CodeNameString=@CodeNameString+CodeName FROM AccountCodes ORDER BY Sort
SELECT @CodeNameString

对于SQL Server 2005和更高版本,请使用空值,如果有数值,我将使用-


如果您使用的是SQL Server 2005或更高版本,则可以将此用于XML路径和填充技巧:

FOR XML路径基本上将字符串连接在一起,形成一个较长的XML结果,如code1、code2、code3等,然后在第一个字符处添加一个NOTING字符,例如,删除多余的第一个逗号,以给出您可能要查找的结果

更新:好的-我理解这些注释-如果数据库表中的文本已经包含诸如或之类的字符,那么我当前的解决方案实际上会将这些字符编码为、和


如果您对XML编码有问题,那么是的,您必须看看@KM提出的解决方案,它也适用于这些字符。我有一个警告:这种方法需要更多的资源和处理——正如你所知道的

这是另一个真实的例子,至少在2008版及更高版本中效果良好

这是原始查询,它使用simple max获取至少一个值:

SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted"
FROM Value_list group by Option_name, Field_M3_name
ORDER BY option_name, Field_M3_name
改进版,其中主要改进是我们以逗号分隔显示所有值:

SELECT from1.keys, from1.option_name, from1.Field_M3_name,

 Stuff((SELECT DISTINCT ', ' + [Option_value] FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Option values",

 Stuff((SELECT DISTINCT ', ' + CAST([Sorting] AS VARCHAR) FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Sorting"

FROM ((SELECT DISTINCT COALESCE(Option_name,'') + '|' + COALESCE(Field_M3_name,'') AS keys, Option_name, Field_M3_name FROM Value_list)
-- WHERE
) from1
ORDER BY keys

请注意,我们已经解决了我所能想到的所有可能出现的空值问题,并且还修复了数值字段排序时出现的错误。

来自msdn,请勿在SELECT语句中使用变量连接值,即计算聚合值。可能会出现意外的查询结果。这是因为不能保证对每个输出行只执行一次选择列表中的所有表达式(包括赋值)


上面的内容似乎表明,如上所述的连接是无效的,因为赋值的执行次数可能超过select返回的行数

SQL Server的哪个版本??和的可能重复:已回答多次。。。但请注意,并非所有的XML路径连接实现都能正确处理XML特殊字符,如我对上一个答案的回答:100有点小,你不觉得吗-@詹姆斯-嗯…刚刚从OP的问题中复制了它,现在已经更新了..谢谢..顺便说一句,该死的,你确实打败了我..是的,我忘记了coalesce/isnull。但是,检查CodeName而不是@CodeNameString是否更有意义?这样可能会丢失数据。更好的是,不用coaleste,而是使用代码名不为null的普通old。这绝对是最好、最优雅的解决方案,非常感谢!这将无法正确处理XML特殊字符等,就像我前面的回答一样,请参见:@marc_s这很危险。我必须附和KM上面的评论。@jnm2:同意-如果有人需要这些特殊字符,KM的解决方案是可行的。但是:它的处理强度要大得多,因此我建议只有在您的文档中确实必须包含这几个特殊的XML字符时才使用它output@marc_s对于大多数用例,您如何提前知道这些字符将来是否会出现?假设你不需要它们是危险的。你能展示关于KM方法的文档吗?它需要大量的资源?我不明白为什么会这样。@jnm2:是的,我希望微软能倾听,并最终给我们一个内置的优化版本!函数来处理这个…简单而优雅的答案。这种方法的使用有任何限制吗?空值由James Wisemann在这个答案上的变体处理
DECLARE @CodeNameString varchar(100)

SELECT 
   @CodeNameString = STUFF( (SELECT ',' + CodeName 
                             FROM dbo.AccountCodes 
                             ORDER BY Sort
                             FOR XML PATH('')), 
                            1, 1, '')
SELECT option_name, Field_M3_name, max(Option_value) AS "Option value", max(Sorting) AS "Sorted"
FROM Value_list group by Option_name, Field_M3_name
ORDER BY option_name, Field_M3_name
SELECT from1.keys, from1.option_name, from1.Field_M3_name,

 Stuff((SELECT DISTINCT ', ' + [Option_value] FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Option values",

 Stuff((SELECT DISTINCT ', ' + CAST([Sorting] AS VARCHAR) FROM Value_list from2
  WHERE COALESCE(from2.Option_name,'') + '|' + COALESCE(from2.Field_M3_name,'') = from1.keys FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'') AS "Sorting"

FROM ((SELECT DISTINCT COALESCE(Option_name,'') + '|' + COALESCE(Field_M3_name,'') AS keys, Option_name, Field_M3_name FROM Value_list)
-- WHERE
) from1
ORDER BY keys