1

我有一张桌子:名字

当我执行 : SELECT * FROM Name时,结果为:

Name
======
aaa
bbb
ccc
sss

我希望结果只在一行中:

Name
====
aaa bbb ccc sss

我怎样才能得到这个?

4

3 回答 3

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
于 2013-04-23T10:46:13.977 回答
2

请试试:

SELECT 
    (SELECT ColumnName + ' '
    FROM YourTable
    FOR XML PATH(''),type).value('.','nvarchar(max)')  AS [Name]
于 2013-04-23T10:47:27.820 回答
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);
}

}

于 2013-04-23T12:10:11.943 回答