SQL을 사용하여 문자열을 연결합니다.원본 테이블의 isnull과 임시 테이블의 차이점은 무엇입니까?
DECLARE @FirstNamesString nvarchar(256)
SELECT
@FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName
FROM
Person p
ORDER BY
p.SortOrder
그리고 내가 좋아하는 첫번째 이름의 목록을 얻을 :
이 문은 작동
Name1, Name2, Name3
가 지금은 이들 각각에 대한 null의 가능성이있는 마지막 이름 필드에 추가 할 명. 나는 아래의 SQL을 시도했지만 난 단지 목록의 마지막 항목 (Name3
) 얻을 :
DECLARE @FirstNamesString nvarchar(256)
SELECT @FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName + ISNULL(' ' + p.LastName, '')
FROM
Person p
ORDER BY
p.SortOrder
을하지만 내가 먼저 임시 테이블에이 이름을 모두 삽입 할 경우, 다음 모든 것이 예상대로 작동합니다
CREATE TABLE #Person2
(
FirstName nvarchar(128) NOT NULL
,LastName nvarchar(256) NULL
,SortOrder int NOT NULL
)
INSERT INTO #Person2 (FirstName, LastName, SortOrder) (
SELECT p.FirstName, p.LastName, p.SortOrder FROM Person p)
DECLARE @FirstNamesString nvarchar(256)
SELECT @FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName + ISNULL(' ' + p.LastName, '')
FROM
#Person2 p
ORDER BY
p.SortOrder
DROP TABLE #Person2
위의 설명과 원본 테이블의 차이점은 무엇입니까? 임시 테이블 경로가 작동하고 나는 그것을 사용하려고하지만 나는 매우 흥미 롭다 ... 나는 무엇을 여기에서 놓치고 있냐?
는
이 @Martin's answer 참조 가능한 해결책으로 업데이트하지만, 문자열의 연결이 작동하지 않을 수 있습니다. 따라서 해결 방법은 먼저 이름 목록을 선택하기 전에 성 테이블에 성을 삽입하는 것입니다.
CREATE TABLE #Person2
(
FirstName nvarchar(256) NOT NULL
,SortOrder int NOT NULL
)
INSERT INTO #Person2 (FirstName, SortOrder) (
SELECT p.FirstName + ISNULL(' ' + p.LastName, ''), p.SortOrder
FROM Person p
)
DECLARE @FirstNamesString nvarchar(256)
SELECT
@FirstNamesString = COALESCE(@FirstNamesString + ', ', '') + p.FirstName
FROM
#Person2 p
ORDER BY
p.SortOrder ASC
'p.FirstName'의 데이터 유형은 무엇입니까? 계획에 추가 캐스팅이 있다는 것을 의미하는 단일 바이트입니까? –
Person.FirstName의 데이터 유형은 nvarchar (128) NOT NULL입니다. –