1

私はテーブルを持っています:名前

: SELECT * FROM Nameを実行すると、結果は次のようになります。

Name
======
aaa
bbb
ccc
sss

結果を1行のみにしたい:

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 に答える
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 に答える