문제

레코드를 꺼내어 각각 문자열로 연결 한 다음 해당 문자열을 출력 해야하는 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top