루프 및 연결 중 T-SQL
-
19-08-2019 - |
문제
레코드를 꺼내어 각각 문자열로 연결 한 다음 해당 문자열을 출력 해야하는 SQL 쿼리가 있습니다. 쿼리의 중요한 부분은 다음과 같습니다.
DECLARE @counter int;
SET @counter = 1;
DECLARE @tempID varchar(50);
SET @tempID = '';
DECLARE @tempCat varchar(255);
SET @tempCat = '';
DECLARE @tempCatString varchar(5000);
SET @tempCatString = '';
WHILE @counter <= @tempCount
BEGIN
SET @tempID = (
SELECT [Val]
FROM #vals
WHERE [ID] = @counter);
SET @tempCat = (SELECT [Description] FROM [Categories] WHERE [ID] = @tempID);
print @tempCat;
SET @tempCatString = @tempCatString + '<br/>' + @tempCat;
SET @counter = @counter + 1;
END
스크립트가 실행되면 @tempCatString
널로 출력합니다 @tempCat
항상 올바르게 출력합니다. 동의가 while 루프 내부에서 작동하지 않는 이유가 있습니까? 증가한 이후로 잘못 보인다 @counter
완벽하게 작동합니다. 그래서 내가 놓친 다른 것이 있습니까?
해결책
작동 해야하는 것처럼 보이지만 서머 계절의 경우 @tempcatstring은 null이라고 생각하는 것 같습니다. 그래서 당신은 다른 어떤 것에 대해 nullconcatenated가 여전히 null이면 항상 null 값을 얻는 것입니다. 당신이 함께 시도하는 것을 제안합니다 COALESCE()
각 변수에서 ""가 null이면 ""으로 설정합니다.
다른 팁
이것은 더 효율적일 것입니다 ....
select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...
select @fn
또한 Concat_null_yields_null을 연결 문제를 해결하기위한 옵션으로 살펴보십시오.
나는 Keithwarren에 동의하지만 항상 쿼리에 절로 주문을 추가해야합니다. 그런 다음 값이 연결되는 순서를 정확히 확인할 수 있습니다.
또한 NULL 값을`` ''로 대체하려는 Coalesce는 빈 행을 효과적으로 산출합니다. 당신이 원하는지 아닌지는 모르겠지만, 대신 where 절에서 필터를 필터하는 경우 ...
마지막으로, 당신은 관심있는 ID를 포함하여 온도 테이블이있는 것 같습니다.이 테이블은 소스 테이블을 필터링하기 위해 조인에 포함될 수 있습니다 ...
DELCARE @output VARCHAR(8000)
SET @output = ''
SELECT
@output = @output + [Categories].Description + '<br/>'
FROM
Categories
INNER JOIN
#vals
ON #vals.val = [Categories].ID
WHERE
[Categories].Description IS NOT NULL
ORDER BY
[Categories].Description