এসকিউএল সার্ভার একাধিক অক্ষরের নিদর্শনগুলি প্রতিস্থাপনের পক্ষে সমর্থন করে না - এটির মাধ্যমে এটি করার জন্য REPLACE10 টি অপারেশন গ্রহণ করা প্রয়োজন।
এই বিষয়টি মনে রেখে এটি করার এক উপায় হ'ল ধারাবাহিকভাবে 0-9 অঙ্কগুলি প্রক্রিয়া করা পুনরাবৃত্ত সিটিই হবে।
এটি প্রতিস্থাপনটি করে এবং তারপরে এবং তার পরে তার পরে কতগুলি অক্ষর ছিল এবং মোটটিতে কী যুক্ত করতে হবে তা জানতে তার দৈর্ঘ্য পরীক্ষা করে।
DECLARE @Input VARCHAR(8000) = 'GR35hc7vdH35';
WITH R(Level,Input,Accumulator,StringLength)
AS (SELECT 0,
Input,
0,
DATALENGTH(Input)
FROM (SELECT REPLACE(@Input, '0', '')) D(Input)
UNION ALL
SELECT NewLevel,
NewInput,
Accumulator + NewLevel * ( StringLength - NewStringLength ),
NewStringLength
FROM R
CROSS APPLY (SELECT Level + 1) C(NewLevel)
CROSS APPLY (SELECT REPLACE(Input, NewLevel, '')) C2(NewInput)
CROSS APPLY (SELECT DATALENGTH(NewInput)) C3(NewStringLength)
WHERE NewLevel <= 9)
SELECT Input AS Col1,
Accumulator AS Col2
FROM R
WHERE Level = 9;
অথবা আপনি সিএলআর এবং নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন (এসকিউএল সার্ভার 2012 সামঞ্জস্যপূর্ণ সংস্করণ)।
using System;
using System.Data.SqlTypes;
using System.Collections;
using System.Text.RegularExpressions;
public partial class UserDefinedFunctions
{
private static readonly Regex digitRegex = new Regex(@"[\d]", RegexOptions.Compiled);
[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FillRow",
TableDefinition = @"Stripped NVARCHAR(MAX),
Total INT")]
public static IEnumerable ReplaceAndTotalise(SqlString input)
{
if (!input.IsNull)
{
int total = 0;
string stripped = digitRegex.Replace((string)input, match =>
{
total += int.Parse(match.Value);
return string.Empty;
});
yield return new Tuple<string, int>(stripped, total);
}
}
public static void FillRow(object resultObject, out SqlString stripped, out SqlInt32 total)
{
var result = (Tuple<string, int>)resultObject;
stripped = result.Item1;
total = result.Item2;
}
}
ব্যবহারের উদাহরণ
SELECT Stripped,
Total
FROM [dbo].[ReplaceAndTotalise]('GR35hc7vdH35')