【SQL Server】複数行データをセミコロン区切りの1行に纏める

※SQL Server 2016にて確認

-- ダミーテーブル
with dummyData as (
	select 'AGroup' as code, 'A01' as child
	union 
	select 'AGroup' , 'A02'
	union
	select 'AGroup' , 'A03'
	union
	select 'BGroup' , 'B01'
	union 
	select 'BGroup' , 'B02'
	union
	select 'BGroup' , 'B03'
	union
	select 'CGroup' , 'C01'
)

select
	code,
	left(hoge.child, len(hoge.child) - 1) as child	--末尾のセミコロンを除く
from
	(
	select distinct
		dummy.code,
		(
			select 
				dummyData.child + ';' AS [text()]	--セミコロン区切りしたい列を指定
			from 
				dummyData
			where
				dummyData.code = dummy.code		--大元のfrom句で指定されているテーブルとJOIN
			for xml path ('')
		) as child
	from
		dummyData dummy
	) hoge

■実行結果

codevalue
AGroupA01;A02;A03
BGroup B01;B02;B03
CGroup C01

【SQL Server】セミコロン区切りの1行データを複数行に変換する

※SQL Server 2016にて確認

-- 1つのコードに複数のデータが入っているダミーテーブル
with dummyData as (
	select 'AGroup' as code, 'A01;A02;A03' as child
	union
	select 'BGroup' , 'B01;B02;B03'
)

select 
	code,	--元々のコード
	value	--childを;で分割した値が入る
from
	dummyData
	cross apply string_split(child, ';')	--セミコロンで区切る

■実行結果

codevalue
AGroupA01
AGroup A02
AGroup A03
BGroupB01
BGroup B02
BGroup B03

【SQL Server】invoke-sqlcmd で 重複する列名は~ エラーが発生する

■エラー内容

「invoke-sqlcmd : 重複する列名は、SQL PowerShell では許可されません。列を繰り返す場合、重複する列には Column_Name AS New_Name の形式で列の別名を使用します。」

■原因

invoke-sqlcmdの-InputFileで指定したSQLファイルの文字コードがSJISであったために、as句で付与した列別名が文字化けしてしまったために発生していた。

SQLファイルの文字コードをサクラエディタなどでUTF-8に修正したところ、エラーが解消された。

【SQL Server】全角文字が含まれるデータを取得する

SELECT
    *
FROM
    テーブル名
WHERE
    LEN(RTRIM(該当フィールド名)) <> DATALENGTH(RTRIM(該当フィールド名))

※SQL Server2008にて動作確認

解説

LEN(文字数の取得)と、DATALENGTH(バイト数の取得)の結果が異なる場合、全角文字が含まれていると判断しています。
尚、LEN関数は末尾に半角スペースが含まれる場合、1文字分少なくカウントされるため、RTRIMであらかじめ末尾のスペースを取り除いた上で比較しています。