Các câu trả lời khác ở đây không được xem xét nếu bạn có tất cả số không (hoặc thậm chí là một số không).
Một số luôn mặc định một chuỗi rỗng thành 0, sai khi nó được để trống.
Đọc lại câu hỏi ban đầu. Điều này trả lời những gì Người hỏi muốn.
Giải pháp số 1:
--This example uses both Leading and Trailing zero's.
--Avoid losing those Trailing zero's and converting embedded spaces into more zeros.
--I added a non-whitespace character ("_") to retain trailing zero's after calling Replace().
--Simply remove the RTrim() function call if you want to preserve trailing spaces.
--If you treat zero's and empty-strings as the same thing for your application,
-- then you may skip the Case-Statement entirely and just use CN.CleanNumber .
DECLARE @WackadooNumber VarChar(50) = ' 0 0123ABC D0 '--'000'--
SELECT WN.WackadooNumber, CN.CleanNumber,
(CASE WHEN WN.WackadooNumber LIKE '%0%' AND CN.CleanNumber = '' THEN '0' ELSE CN.CleanNumber END)[AllowZero]
FROM (SELECT @WackadooNumber[WackadooNumber]) AS WN
OUTER APPLY (SELECT RTRIM(RIGHT(WN.WackadooNumber, LEN(LTRIM(REPLACE(WN.WackadooNumber + '_', '0', ' '))) - 1))[CleanNumber]) AS CN
--Result: "123ABC D0"
Giải pháp số 2 (với dữ liệu mẫu):
SELECT O.Type, O.Value, Parsed.Value[WrongValue],
(CASE WHEN CHARINDEX('0', T.Value) > 0--If there's at least one zero.
AND LEN(Parsed.Value) = 0--And the trimmed length is zero.
THEN '0' ELSE Parsed.Value END)[FinalValue],
(CASE WHEN CHARINDEX('0', T.Value) > 0--If there's at least one zero.
AND LEN(Parsed.TrimmedValue) = 0--And the trimmed length is zero.
THEN '0' ELSE LTRIM(RTRIM(Parsed.TrimmedValue)) END)[FinalTrimmedValue]
FROM
(
VALUES ('Null', NULL), ('EmptyString', ''),
('Zero', '0'), ('Zero', '0000'), ('Zero', '000.000'),
('Spaces', ' 0 A B C '), ('Number', '000123'),
('AlphaNum', '000ABC123'), ('NoZero', 'NoZerosHere')
) AS O(Type, Value)--O is for Original.
CROSS APPLY
( --This Step is Optional. Use if you also want to remove leading spaces.
SELECT LTRIM(RTRIM(O.Value))[Value]
) AS T--T is for Trimmed.
CROSS APPLY
( --From @CadeRoux's Post.
SELECT SUBSTRING(O.Value, PATINDEX('%[^0]%', O.Value + '.'), LEN(O.Value))[Value],
SUBSTRING(T.Value, PATINDEX('%[^0]%', T.Value + '.'), LEN(T.Value))[TrimmedValue]
) AS Parsed
Các kết quả:

Tóm lược:
Bạn có thể sử dụng những gì tôi có ở trên để loại bỏ một lần của zero-zero.
Nếu bạn có kế hoạch tái sử dụng nó rất nhiều, thì hãy đặt nó vào Hàm Inline-Table-Valued-Function (ITVF).
Bạn lo lắng về các vấn đề về hiệu suất với UDF là điều dễ hiểu.
Tuy nhiên, vấn đề này chỉ áp dụng cho Hàm đa hướng và Hàm đa bảng-Hàm.
Sử dụng ITVF là hoàn toàn tốt.
Tôi có cùng một vấn đề với cơ sở dữ liệu của bên thứ 3 của chúng tôi.
Với các trường Alpha-Numeric, nhiều trường được đưa vào mà không có không gian hàng đầu, dang con người!
Điều này làm cho việc tham gia không thể thực hiện được mà không làm sạch các số 0 bị mất.
Phần kết luận:
Thay vì loại bỏ các số 0 đứng đầu, bạn có thể muốn xem xét chỉ đệm các giá trị đã cắt của mình với các số 0 đứng đầu khi bạn tham gia.
Tốt hơn hết, hãy dọn sạch dữ liệu của bạn trong bảng bằng cách thêm các số 0 đứng đầu, sau đó xây dựng lại các chỉ mục của bạn.
Tôi nghĩ rằng đây sẽ là CÁCH nhanh hơn và ít phức tạp hơn.
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF(' 0A10 ', ''))), 10)--0000000A10
SELECT RIGHT('0000000000' + LTRIM(RTRIM(NULLIF('', ''))), 10)--NULL --When Blank.