1

私のコード:

if object_id('tempdb..#t1') is not null drop table #t1

create table #t1 (ID int, name varchar(10))

insert into #t1 values (1,'2'), (6,'2'), (6,'2'), (1,'4')

DECLARE @CHARS VARCHAR(100) = ''
SELECT @CHARS = @CHARS + name + ', ' -- <---CODE OF INTEREST
FROM #t1

これは を返します2, 2, 2, 4,。すべては順調です。

ただし、上記のコードを変更してコンマとスペースを最初に追加すると、次のようになります。

DECLARE @CHARS VARCHAR(100) = ''
SELECT @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
FROM #t1

SELECT @CHARS

戻ります, , , , 2224。返してはいけません, 2, 2, 2, 4か?

4

1 に答える 1

1

2 番目の式のロジックは次のとおりです。すべてのレコードに対して、文字列を @CHARS の右側に追加します。

あなたが持っていると仮定します

insert into #t1 values (1,'2'), (6,'3'), (6,'4'), (1,'5')

より明確にするために

最初の行については、それが返されます", 2"

2 行目では、@CHARS は", "+ ", 2"+ "3"になります。

3 行目の @CHARS は", , 23"@CHARS を ", "+ ", , 23"+に設定します。"4"

以下のクエリを試して、何が起こっているかを確認してください。

DECLARE @CHARS VARCHAR(100) = ''
SELECT top 1 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
FROM #t1

print @CHARS
go

Result: , 2
--------------------------
DECLARE @CHARS VARCHAR(100) = ''
SELECT top 2 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
FROM #t1

print @CHARS
go

Result: , , 23
----------------------
DECLARE @CHARS VARCHAR(100) = ''
SELECT top 3 @CHARS = ', ' + @CHARS + name -- <---CODE OF INTEREST
FROM #t1

print @CHARS
go
Result: , , , 234
于 2016-03-28T23:27:17.780 に答える