Mam kolumnę NVARCHAR(10)
w tabeli. Może przechowywać dowolny typ ciągów UNICODE.Serwer SQL: Zastąp znaki inne niż znak w łańcuchu bez użycia tabeli tymczasowej.
Chcę zastąpić każdy znak różny od "1" za pomocą "0".
Załóżmy, że mam ciąg "C18 *". Powinienem dostać "0100000100".
udało mi się to zrobić przy użyciu tabeli pomocnika, który zawiera indeksy od 1 do rozmiaru mojego kolumnie (10), jak ten:
CREATE TABLE HELP(Idx INT)
INSERT INTO HELP
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
DECLARE @myStr VARCHAR(10)
SET @myStr = 'C18*'
SELECT STUFF((SELECT '' + CASE(B.Ch) WHEN '1' THEN '1' ELSE '0' END FROM (
SELECT SUBSTRING(A.Val,H.Idx,1) AS Ch
FROM
(SELECT @myStr AS Val) A
CROSS JOIN HELP H
)B FOR XML PATH('')),1,0,'')
To działa, ale można to zrobić w ładniejszy droga? To wydaje się brzydkie dla prostej aktualizacji, ignorując fakt, że rozmiar kolumny może się zmieniać z czasem. Musi również działać pod SQL> = 2005.
SQL Fiddlehere
Dzięki!
Można to zrobić tylko za pomocą standardowego proc lub możesz użyć procedury .Net? Czy jest to coś, co musi działać wielokrotnie lub tylko raz, aby wyczyścić dane? –
@MauriceReeves Musi działać tylko raz (kilka uszkodzonych danych w kilku naszych bazach danych) przeciwko dziesiątkom dużych tabel (10K + wiersze). Prosta aplikacja konsolowa rozwiązałaby to, ale zapytałam, czy ta sama sytuacja się powtórzy + nie podoba mi się ta tabela temp. – darkdante
Tabela numerów jest bardzo przydatna. Wielu ma go jako stały stół. –