2013-06-05 32 views
1

在MSSQL表(“用户名”)的查询结果,我有以下两个记录:MSSQL - 的毗连使用IN

name ¦ nickname 
John  Johny 
Marc  Marco 

我想做一个查询,将返回“佐尼,马可“当我以约翰和马克的绰号作为k时。

我已经试过如下:

declare @consolidatedNicknames varchar(2000) 
set @consolidatedNicknames = '' 
select @consolidatedNicknames = @consolidatedNicknames + nickname + ';' 
From username WHERE name IN ('John','Marc') 

但它只返回我“约翰”的绰号。

它如何连接'John'和'Marc'的昵称?

非常感谢。

+1

搜索[ “SQL Server组-CONCAT”(http://stackoverflow.com/questions/tagged/sql-server-group-concat) – Andomar

+4

似乎按预期工作对我来说:HTTP:/ /sqlfiddle.com/#!3/6bfbe/1 – Lamak

+0

@Lamak - 可能你应该向OP指出你没有按照原样使用他/她的脚本。 –

回答

0

您的示例代码按照我的预期工作。我用大字符串(50k个字符或更多)的方法遇到了一些问题。这是一个不同的版本,我发现它更健壮一些。

DECLARE @consolidatedNicknames varchar(2000) 
SET @consolidatedNicknames = '' 

SELECT @consolidatedNicknames = 
     STUFF((SELECT ', ' + username.nickname 
       FROM username 
       WHERE name IN ('John','Marc') 
       FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)') 
      , 1, 2, '') 
+0

感谢您的快速回复。然而,当我“打印@consolidatedNicknames”我只得到“Marco”,而不是“Johny,Marco”,因为我期待... – user2456059

+0

我的猜测是你的数据有问题。当您尝试使用现有代码时,您会注意到几条评论。无论是或者你有一些设置干扰。尝试运行'SELECT username.nickname \t FROM用户名 \t姓名IN('John','Marc')',看看你得到了什么。 –

+0

谢谢,我不知道发生了什么,但你说得对,它似乎在工作!感谢更强大的功能。 – user2456059

0

STUFF和XML是你需要的。 看看this article

这里是一个函数,我建立做一些非常相似的东西。

CREATE FUNCTION [dbo].[CapOwnerList] 
    (
    @Seperator nvarchar(100) = ',' 
    ) 

    RETURNS @ConcatValues TABLE 
     (
     ID DECIMAL(28,0) NOT NULL 
     ,VALUE NVARCHAR(MAX) 
     ) 
    AS 
    BEGIN 
     DECLARE @TempTable TABLE (ID INT, VAL VARCHAR(MAX)); 

     INSERT INTO @TempTable (ID,VAL) 
     SELECT C2O.CAP_ID 
       ,FP.NAME 
     FROM REL_CAP_HAS_BUS_OWNER C2O 
     INNER JOIN 
       FACT_PERSON FP 
     ON  C2O.PERSON_ID = FP.ID 
     ORDER BY 
       FP.NAME 
     ; 

     IF RIGHT(@Seperator,1)<>' ' 
      SET @Seperator = @Seperator+' '; 

     INSERT @ConcatValues 
     SELECT DISTINCT 
       T1.ID 
       ,STUFF((SELECT @Seperator + T2.VAL FROM @TempTable AS T2 WHERE T2.ID = T1.ID FOR XML PATH('')), 1, LEN(@Seperator), '') AS VALS 
     FROM @TempTable AS T1; 

     RETURN; 
    END 

GO 
+0

请注意,如上面的答案中所述,在不使用'TYPE).value('。','NVARCHAR(MAX)'的情况下使用FOR XML方法会导致特殊字符(例如'>')被转义。 – GarethD