आप पैटर्न (स्ट्रिंग की) घटना की पहली अनुक्रमणिका खोजने के लिए PATINDEX का उपयोग कर सकते हैं। फिर मिलान किए गए पैटर्न (स्ट्रिंग) में एक और स्ट्रिंग को भरने के लिए STUFF का उपयोग करें।
प्रत्येक पंक्ति के माध्यम से लूप। प्रत्येक अवैध पात्रों को आप जो चाहते हैं उससे बदलें। आपके मामले में गैर-संख्यात्मक को रिक्त स्थान से बदलें। आंतरिक लूप यह है कि यदि आपके पास वर्तमान सेल में लूप के एक से अधिक अवैध वर्ण हैं।
DECLARE @counter int
SET @counter = 0
WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table))
BEGIN
WHILE 1 = 1
BEGIN
DECLARE @RetVal varchar(50)
SET @RetVal = (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '')
FROM Table
WHERE ID_COLUMN = @counter)
IF(@RetVal IS NOT NULL)
UPDATE Table SET
Column = @RetVal
WHERE ID_COLUMN = @counter
ELSE
break
END
SET @counter = @counter + 1
END
सावधानी:हालांकि यह धीमा है! वर्चर कॉलम होने से असर पड़ सकता है। तो एलटीआरआईएम आरटीआरआईएम का उपयोग करने से थोड़ी मदद मिल सकती है। भले ही, यह धीमा है।
श्रेय इस StackOverFlow उत्तर को जाता है।
EDITCredit @srutzky को भी जाता है
संपादित करें (@Tmdean द्वारा) एक समय में एक पंक्ति करने के बजाय, इस उत्तर को अधिक सेट-आधारित समाधान के लिए अनुकूलित किया जा सकता है। यह अभी भी एक ही पंक्ति में गैर-संख्यात्मक वर्णों की अधिकतम संख्या को पुनरावृत्त करता है, इसलिए यह आदर्श नहीं है, लेकिन मुझे लगता है कि इसे अधिकांश स्थितियों में स्वीकार्य होना चाहिए।
WHILE 1 = 1 BEGIN
WITH q AS
(SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
FROM Table)
UPDATE Table
SET Column = STUFF(Column, q.n, 1, '')
FROM q
WHERE Table.ID_Column = q.ID_Column AND q.n != 0;
IF @@ROWCOUNT = 0 BREAK;
END;
यदि आप तालिका में थोड़ा सा कॉलम बनाए रखते हैं जो इंगित करता है कि फ़ील्ड को अभी तक साफ़ किया गया है या नहीं, तो आप दक्षता में काफी सुधार कर सकते हैं। (NULL मेरे उदाहरण में "अज्ञात" का प्रतिनिधित्व करता है और कॉलम डिफ़ॉल्ट होना चाहिए।)
DECLARE @done bit = 0;
WHILE @done = 0 BEGIN
WITH q AS
(SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
FROM Table
WHERE COALESCE(Scrubbed_Column, 0) = 0)
UPDATE Table
SET Column = STUFF(Column, q.n, 1, ''),
Scrubbed_Column = 0
FROM q
WHERE Table.ID_Column = q.ID_Column AND q.n != 0;
IF @@ROWCOUNT = 0 SET @done = 1;
-- if Scrubbed_Column is still NULL, then the PATINDEX
-- must have given 0
UPDATE table
SET Scrubbed_Column = CASE
WHEN Scrubbed_Column IS NULL THEN 1
ELSE NULLIF(Scrubbed_Column, 0)
END;
END;
यदि आप अपनी स्कीमा नहीं बदलना चाहते हैं, तो मध्यवर्ती परिणामों को एक तालिका-मूल्यवान चर में संग्रहीत करने के लिए अनुकूलित करना आसान है जो अंत में वास्तविक तालिका पर लागू हो जाता है।