Самый эффективный T-SQL способ заполнить varchar слева к определенной длине?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
201
задан Cade Roux 18 March 2012 в 14:29
поделиться

9 ответов

Это - просто неэффективное использование SQL, неважно, как Вы делаете это.

, возможно, что-то как

right('XXXXXXXXXXXX'+ rtrim(@str), @n)

, где X Ваш дополнительный символ и @n, является количеством символов в получившей строке (предполагающий необходимость в дополнении, потому что Вы имеете дело с фиксированной длиной).

, Но поскольку я сказал, что необходимо действительно постараться не делать это в базе данных.

319
ответ дан AlexCuse 23 November 2019 в 05:02
поделиться
select right(replicate(@padchar, @len) + @str, @len)
1
ответ дан Gordon Bell 23 November 2019 в 05:02
поделиться

В SQL Server 2005 и позже Вы могли создать функцию CLR, чтобы сделать это.

1
ответ дан Kramii Reinstate Monica 23 November 2019 в 05:02
поделиться

вероятно, излишество, я часто использую этот UDF:

CREATE FUNCTION [dbo].[f_pad_before](@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1))
RETURNS VARCHAR(255) AS  
BEGIN

-- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character
 RETURN ltrim(rtrim(
        CASE
          WHEN LEN(@string) < @desired_length
            THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string
          ELSE @string
        END
        ))
END

Так, чтобы можно было сделать вещи как:

select dbo.f_pad_before('aaa', 10, '_')
2
ответ дан ila 23 November 2019 в 05:02
поделиться

Я не уверен, что метод, который Вы даете, действительно неэффективен, но альтернативный путь, пока это не должно быть гибко в длине или дополнительном символе, был бы (предполагающий, что Вы хотите дополнить его "0" к 10 символам:

DECLARE
   @pad_characters VARCHAR(10)

SET @pad_characters = '0000000000'

SELECT RIGHT(@pad_characters + @str, 10)
7
ответ дан Tom H 23 November 2019 в 05:02
поделиться
@padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once

SELECT RIGHT(@padstr + @str, @len)
16
ответ дан Sklivvz 23 November 2019 в 05:02
поделиться

Несколько человек дали версии этого:

right('XXXXXXXXXXXX'+ @str, @n)

быть осторожным с этим, потому что это усечет Ваши фактические данные, если это будет более длинно, чем n.

36
ответ дан abatishchev 23 November 2019 в 05:02
поделиться

Как насчет этого:

replace((space(3 - len(MyField))

3 количество zeros заполнять

1
ответ дан A_Sk 23 November 2019 в 05:02
поделиться

Возможно чрезмерное уничтожение У меня есть эти UDF для прокладки влево и вправо

ALTER   Function [dbo].[fsPadLeft](@var varchar(200),@padChar char(1)='0',@len int)
returns varchar(300)
as
Begin

return replicate(@PadChar,@len-Len(@var))+@var

end

и вправо

ALTER function [dbo].[fsPadRight](@var varchar(200),@padchar char(1)='0', @len int) returns varchar(201) as
Begin

--select @padChar=' ',@len=200,@var='hello'


return  @var+replicate(@PadChar,@len-Len(@var))
end
9
ответ дан 23 November 2019 в 05:02
поделиться