私はテーブルを持っています:名前
: SELECT * FROM Nameを実行すると、結果は次のようになります。
Name
======
aaa
bbb
ccc
sss
結果を1行のみにしたい:
Name
====
aaa bbb ccc sss
どうすればこれを入手できますか?
私はテーブルを持っています:名前
: SELECT * FROM Nameを実行すると、結果は次のようになります。
Name
======
aaa
bbb
ccc
sss
結果を1行のみにしたい:
Name
====
aaa bbb ccc sss
どうすればこれを入手できますか?
これを試してみてください -
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
要件に合わせてプディングを使いすぎるかもしれませんが、行を単一の値に連結するための 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);
}
}