После concat текста я получаю NULL - PullRequest
0 голосов
/ 28 мая 2020

Я пробую concat 2 string и меняю его, но в результате получаю NULL, а не текст для ex. первая строка «a1» вторая строка «b2» результат «21ba»

CREATE function addToString(@val1 varchar(100),@val2 varchar(100))
returns varchar(200)
as
begin
    declare @i as int
    declare @output as varchar(200)
    if len(@val1)!=len(@val2)
        set @output='length error: '+cast(len(@val1) as varchar(10))+
        '<>'+cast(len(@val2) as varchar(10)) 
    else
        select @i=len(@val1)-1
        while @i>=0
            begin
                set @output= concat(@output,substring(@val2,@i,1))
                set @output= concat(@output,substring(@val1,@i,1))  
                set @i=@i-1
            end
    return @output
end
go
select dbo.[addToString]('a1','b2') as txt

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

Ваш лог c неверен, и вы не инициализируете @output:

CREATE function addToString(@val1 varchar(100),@val2 varchar(100))
returns varchar(200)
as
begin
    declare @i as int

 -- declare @output as varchar(200) -- initialized to NULL
    declare @output as varchar(200) = ''

    if len(@val1)!=len(@val2)
        set @output='length error: '+cast(len(@val1) as varchar(10))+
        '<>'+cast(len(@val2) as varchar(10)) 
    else
     -- select @i=len(@val1)-1 -- strips the last char
        select @i=len(@val1)

     -- while @i>=0
        while @i>0

            begin
                set @output= concat(@output,substring(@val2,@i,1))
                set @output= concat(@output,substring(@val1,@i,1))  
                set @i=@i-1
            end
    return @output
end
;
0 голосов
/ 28 мая 2020

Удалите -1 из функции len

  CREATE function addToString(@val1 varchar(100),@val2 varchar(100))
    returns varchar(200)
    as
    begin
        declare @i as int
        declare @output as varchar(200)
        if len(@val1)!=len(@val2)
            set @output='length error: '+cast(len(@val1) as varchar(10))+
            '<>'+cast(len(@val2) as varchar(10)) 
        else
            select @i=len(@val1)
            while @i>=0
                begin
                    set @output= concat(@output,substring(@val2,@i,1))
                    set @output= concat(@output,substring(@val1,@i,1))  
                    set @i=@i-1
                end
        return @output
    end
    go
    select dbo.[addToString]('a1','b2') as txt
0 голосов
/ 28 мая 2020

Вам необходимо обработать NULL значений. Возможно, самый простой способ - просто заменить его пустой строкой в ​​верхней части хранимой процедуры:

select @val2 = coalesce(@val2, '');

Или объявить параметры как NOT NULL, чтобы значения NULL не передавались.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...