sql查询以下模式

时间:2013-04-23 10:43:41

标签: sql sql-server database

我有一张桌子:姓名

当我执行以下操作: SELECT * FROM Name 时,它会将结果显示为:

Name
======
aaa
bbb
ccc
sss

我希望结果只有一行:

Name
====
aaa bbb ccc sss

我怎么能得到这个?

3 个答案:

答案 0 :(得分:3)

试试这个 -

DECLARE @temp TABLE
(
      col NVARCHAR(50)
)

INSERT INTO @temp (col)
VALUES 
    ('aaa'),
    ('bbb'),
    ('ccc'),
    ('sss')

SELECT str_string = (
    SELECT col + ' '
    FROM @temp
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')

或试试这个 -

DECLARE @string NVARCHAR(MAX) = ''

SELECT @string = @string + col + ' '
FROM @temp

SELECT @string

答案 1 :(得分:2)

请尝试:

SELECT 
    (SELECT ColumnName + ' '
    FROM YourTable
    FOR XML PATH(''),type).value('.','nvarchar(max)')  AS [Name]

答案 2 :(得分:0)

可能会因为您的要求过度使用布丁,但是将行连接成单个值的CLR聚合函数在您的工具箱中非常方便。像下面的东西。在我的经验中,运行速度比xml快得多,并支持GROUP BY等,因此功能非常强大。仅适用于SQL2k8或更高版本,如果它将字符串串联到超过2GB,则会爆炸。

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = -1)]
public struct Concatenate : IBinarySerialize
{
public string concat;
public string delimiter;

public void Init()
{
    this.concat = "";
}

public void Accumulate(SqlString text, SqlString delim)
{
    if (!text.IsNull)
    {
        concat += (string)text + (string)delim;
    }
    delimiter = (string)delim;
}

public void Merge(Concatenate Group)
{
    concat += (string)Group.concat + (string)Group.delimiter;
    delimiter = (string)Group.delimiter;
}

public SqlString Terminate()
{
    return concat.Substring(0, concat.Length - delimiter.Length);
}

public void Read(BinaryReader r)
{
    delimiter = r.ReadString();
    concat = r.ReadString();
}

public void Write(BinaryWriter w)
{
    w.Write(delimiter);
    w.Write(concat);
}

}