Thursday, August 7, 2008

Adding Regular Expressions (Regex) to SQL Server 2005

It is very easy to add Regular Expressions or other custom functionality to SQL Server 2005 because it support CLR. This means all you have to do it create a custom Assembly, mark it up with some attributes (similar to the way you do web services), and click the deploy button, and that is it. Microsoft really does make it easy using Visual Studio 2005 (and 2008 I assume). All you have to do it create a SQL Server Project. You can use VB.NET or C#, just pick the appropriate SQL Server Project. It pretty much walks you through creating the project. After it is done, you will need to right-click the project | Add | User-Defined Function... Give it whatever name you want. It gives you a simple stub. Just build and deploy. It deploys the assembly to the database it helps you with initially, and makes User-Defined functions (that call the assembly). You can then call your function like any other User-Defined function. The name and parameters show up in the User-Defined functions section under Database | Programmability | Functions | Scalar-valued Functions. It was also recommended by someone (see references) to in execute the following SQL (I only did it the first time I deployed) to enable CLR and install required support. sp_configure 'clr enabled',1 reconfigure There is one VERY important thing you need add to any method you want to be able to access from SQL. You must add the attribute [SqlFunction]. The method must also be public and static I believe. The parameters and return value have to be SQL types like: SqlChars, SqlString, SqlInt32, etc. You can use standard C# and VB.NET types everywhere within your method, but the parameters and return value MUST be SQL types. Below is my implementation (or at least part what I wrote and part an adaptation of parts from what other people wrote... see references) of three key Regular Expression methods I think are very useful.
  • RegexMatch - returns 1 if pattern can be found in input, else 0
  • RegexReplace - replaces all matches in input with a specified string
  • RegexSelectOne - returns the first, second, third, etc match that can be found in the input
  • RegexSelectAll - returns all matches delimited by separator that can be found in the input
Examples of how to use them in SQL:
  • select dbo.RegexMatch( N'123-45-6749', N'^\d{3}-\d{2}-\d{4} Returns 1 in this case since the phone number pattern is matched
  • select dbo.RegExReplace('Remove1All3Letters7','[a-zA-Z]','') Returns 137 since all alpha characters where replaced with no character
  • select dbo.RegexSelectOne('123-45-6749xxx222-33-4444', '\d{3}-\d{2}-\d{4}', 0) Returns 123-45-6789 since first match was specifed. If last parameter was 1 then the second match (222-33-4444) would be returned.
  • select dbo.RegexSelectAll('123-45-6749xxx222-33-4444', '\d{3}-\d{2}-\d{4}', '|') Returns 123-45-6749|222-33-4444
The actual implementation of this is nothing special other than the conversion of SQL Types. The complete source code (no project since it is so specific to your environment) to the implementation is available for download here.

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
using System.Text;

public partial class UserDefinedFunctions
{

    public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline;

    [SqlFunction]
    public static SqlBoolean RegexMatch(SqlChars input, SqlString pattern)
    {
        Regex regex = new Regex(pattern.Value, Options);
        return regex.IsMatch(new string(input.Value));
    }

    [SqlFunction]
    public static SqlString RegexReplace(SqlString expression, SqlString pattern, SqlString replace)
    {
        if (expression.IsNull || pattern.IsNull || replace.IsNull)
            return SqlString.Null;

        Regex r = new Regex(pattern.ToString());
        return new SqlString(r.Replace(expression.ToString(), replace.ToString()));
    }

    // returns the matching string. Results are separated by 3rd parameter
    [SqlFunction]
    public static SqlString RegexSelectAll(SqlChars input, SqlString pattern, SqlString matchDelimiter)
    {
        Regex regex = new Regex(pattern.Value, Options);
        Match results = regex.Match(new string(input.Value));

        StringBuilder sb = new StringBuilder();
        while (results.Success)
        {
            sb.Append(results.Value);

            results = results.NextMatch();

            // separate the results with newline|newline
            if (results.Success)
            {
                sb.Append(matchDelimiter.Value);
            }
        }

        return new SqlString(sb.ToString());

    }

    // returns the matching string
    // matchIndex is the zero-based index of the results. 0 for the 1st match, 1, for 2nd match, etc
    [SqlFunction]
    public static SqlString RegexSelectOne(SqlChars input, SqlString pattern, SqlInt32 matchIndex)
    {
        Regex regex = new Regex(pattern.Value, Options);
        Match results = regex.Match(new string(input.Value));

        string resultStr = "";
        int index = 0;

        while (results.Success)
        {
            if (index == matchIndex)
            {
                resultStr = results.Value.ToString();
            }

            results = results.NextMatch();
            index++;

        }

        return new SqlString(resultStr);

    }

};

What I used to get started. http://weblogs.sqlteam.com/jeffs/archive/2007/04/27/SQL-2005-Regular-Expression-Replace.aspx How to optimize regex calls: http://blogs.msdn.com/sqlclr/archive/2005/06/29/regex.aspx More Information: http://msdn.microsoft.com/en-us/magazine/cc163473.aspx I found this after writing this, but it explains other details I did not. http://www.codeproject.com/KB/string/SqlRegEx.aspx?display=PrintAll

280 comments:

  1. Just geeks, I'm hoping for some help!!

    Everything I've read about CLR says it's super easy. I've downloaded the C# code from Microsoft (http://msdn.microsoft.com/en-us/magazine/cc163473.aspx), but my Visual Studio 2005 doesn't have the option to create a SQL Server Project or even the "Languages" drop down on the left.

    Do I need to install C# in VS somehow?!

    Thanks,
    Adam

    ReplyDelete
  2. Adam,

    Did you install Visual Studio 2005 explicitly? When you do you select the languages you want to have installed. By default C# is one of them. What version of Visual Studio 2005 are you running? You can check it by choosing About Microsoft Visual Studio under the Help menu (which is one of the menus in Visual Studio 2005). You should have something like Professional Edition or maybe you downloaded the FREE Express version.

    My guess is that you still need to install a full version of Visual Studio 2005. I suspect you are probably looking at the Visual Studio 2005 that gets installed with MS SQL Server 2005. This is NOT what you need. It is really just a stripped down version of VS2005, and does not have support for C#, websites, etc that the full versions have.

    You can if you have the MS SQL Server version of VS2005 installed by doing the same as I described above, but you will see that the name is Microsoft Visual Studio 2005, but it will not say anything else like Express or Professional Edition. You will also only see 3 products installed in that same window. You will likely see, SQL Server Analysis Services, SQL Server Integration Services, SQL Server Reporting Services. If C# was included in the installation, you would see Microsoft Visual C# 2005 in this same list.

    Assuming I am correct, I recommend VS2005 Professional Edition since that is what I am using and I know it works. You can try the Visual C# 2008 Express Edition, but I have not tried it and suspect it does not support the SQL Server project type. You can download it here (http://www.microsoft.com/eXPress/download/). In theory, you could do this from any Library project I would imagine, but deploying manually is not for the faint of heart and I would not recommend it for someone not familiar with how to do so unless you find some docs on it. Visual Studio Profession 2005 does the deployment with a very nice user interface.

    Let me know how it goes.

    I hope you find this useful.

    Brent

    ReplyDelete
  3. You don't need Studio to register. Use the Express version, create a Dll project called RegExForSQL. Add a class file. Replace the class with the UserDefinedFunctions above.
    Compile the project

    Copy the dll to an installation location. For instance c:\RegExForSQL

    Use the following to register the DLL in you SQL database update the bold areas before running.



    EXEC sp_configure 'clr enabled', '1'

    GO

    reconfigure
    Use [DatabaseName]

    GO
    CREATE ASSEMBLY asmRexExp from 'C:\RegExForSQL\RegExForSQL.dll' WITH
    PERMISSION_SET = SAFE



    GO

    --RegexMatch(SqlChars input, SqlString pattern) CREATE FUNCTION
    USE [ScratchPad]
    GO

    /****** Object: UserDefinedFunction [dbo].[RegexMatch] Script Date:
    11/03/2009 18:34:40 ******/
    CREATE FUNCTION [dbo].[RegexMatch](@input [nvarchar](max), @pattern
    [nvarchar](max))
    RETURNS [bit] WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME [asmRexExp].[RegExForSQL.UserDefinedFunctions].[RegexMatch]
    GO


    GO




    /* Returns a comma separated string of found objects
    * Example usage SELECT [Message], dbo.RegexReplace(
    '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|
    [01]?[0-9][0-9]?)\b', [Message], 'new text') as [NewText] from tblSample
    * C# function --SqlString RegexReplace(SqlString expression, SqlString
    pattern, SqlString replace)
    *
    */
    USE [ScratchPad]
    GO

    /****** Object: UserDefinedFunction [dbo].[RegexReplace] Script Date:
    11/03/2009 18:34:20 ******/
    CREATE FUNCTION [dbo].[RegexReplace](@expression [nvarchar](max), @pattern
    [nvarchar](max), @replace [nvarchar](max))
    RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME [asmRexExp].[RegExForSQL.UserDefinedFunctions].[RegexReplace]
    GO


    GO



    /* Returns a comma separated string of found objects
    * Example usage SELECT [Message], dbo.RegexSelectAll([Message],
    '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[
    01]?[0-9][0-9]?)\b', ',') as [IPAddress] from tblSample
    * C# function --SqlString RegexSelectAll(SqlChars input, SqlString pattern,
    SqlString matchDelimiter)
    *
    */

    GO

    /****** Object: UserDefinedFunction [dbo].[RegexSelectAll] Script Date:
    11/03/2009 18:34:00 ******/
    CREATE FUNCTION [dbo].[RegexSelectAll](@input [nvarchar](max), @pattern
    [nvarchar](max), @matchDelimiter [nvarchar](max))
    RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME
    [asmRexExp].[RegExForSQL.UserDefinedFunctions].[RegexSelectAll]
    GO


    GO




    /* Returns finding matchIndex of a zero based index
    * Example usage SELECT [Message], dbo.RegexSelectOne([Message],
    '\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[
    01]?[0-9][0-9]?)\b', 0) as [IPAddress] from tblSample
    * C# function --SqlString RegexSelectOne(SqlChars input, SqlString pattern,
    SqlInt32 matchIndex)
    *
    */

    GO

    /****** Object: UserDefinedFunction [dbo].[RegexSelectOne] Script Date:
    11/03/2009 18:33:34 ******/
    CREATE FUNCTION [dbo].[RegexSelectOne](@input [nvarchar](max), @pattern
    [nvarchar](max), @matchIndex [int])
    RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME
    [asmRexExp].[RegExForSQL.UserDefinedFunctions].[RegexSelectOne]
    GO

    ReplyDelete
  4. Anonymous,

    Thank you very much for sharing that wealth of knowledge. I knew it was possible, but I never had a need to figure out all the code. Good work!

    Thank you,

    Brent

    ReplyDelete
  5. Thanks for the informative post and the links posted.

    ReplyDelete
  6. Great stuff, got me past a roadblock with using regular sql functions to do a complex match.

    Turned out that Visual Studio 2008 was also giving me issues with the server explorer, used devenv /setup in Visual studio command prompt to fix that and then your code worked perfectly.

    I will be loading up my sql database with a bunch of regular expression functions after this.

    Thanks again

    ReplyDelete
  7. Great blog! Thanks for giving such valuable information, this is unique one. Really admired

    Dot Net Training in Chennai

    ReplyDelete
  8. You’ve written a really great article here. Your writing style makes this material easy to understand.. I agree with some of the many points you have made. Thank you for this is real thought-provoking content
    ANGULARJS
    Click here:
    Angularjs training in chennai

    Click here:
    angularjs training in bangalore

    Click here:
    angularjs training in online

    Click here:
    angularjs training in Annanagar

    ReplyDelete
  9. A good blog always comes-up with new and exciting information and while reading I have feel that this blog is really have all those quality that qualify a blog to be a one.I wanted to leave a little comment to support you and wish you a good continuation. Wishing you the best of luck for all your blogging efforts read this.
    Click here:
    Microsoft azure training in chennai
    Click here:
    Microsoft azure training in online
    Click here:
    Microsoft azure training in tambaram
    Click here:
    Microsoft azure training in chennai
    Click here:
    Microsoft azure training in annanagar

    ReplyDelete
  10. We are a group of volunteers and starting a new initiative in a community. Your blog provided us valuable information to work on.You have done a marvellous job!
    java training in chennai | java training in bangalore

    java online training | java training in pune

    ReplyDelete
  11. This blog is the general information for the feature. You got a good work for these blog.We have a developing our creative content of this mind.Thank you for this blog. This for very interesting and useful.
    Data Science training in rajaji nagar | Data Science with Python training in chenni
    Data Science training in electronic city | Data Science training in USA
    Data science training in pune | Data science training in kalyan nagar

    ReplyDelete
  12. Expected to form you a next to no word to thank you once more with respect to the decent recommendations you've contributed here.
    health and safrety courses in chennai

    ReplyDelete
  13. Are you trying to move in or out of Jind? or near rohtak Find the most famous, reputed and the very best of all Packers and Movers by simply calling or talking to Airavat Movers and Packers

    Packers And Movers in Jind

    Packers And Movers in Rohtak

    Movers And Packers in Rohtak

    ReplyDelete
  14. Very informative and well written post! Quite interesting and nice topic chosen for the post.
    thanks for sharing this nice post,
    tally course in hyderabad

    ReplyDelete
  15. Were a gaggle of volunteers as well as starting off a brand new gumption within a community. Your blog furnished us precious details to be effective on. You've got completed any amazing work!

    angularjs online training

    apache spark online training

    informatica mdm online training

    devops online training

    aws online training

    ReplyDelete
  16. I think things like this are really interesting. I absolutely love to find unique places like this. It really looks super creepy though!!
    R Training Institute in Chennai | R Programming Training in Chennai

    ReplyDelete
  17. Really very nice blog information for this one and more technical skills are improve,i like that kind of post.

    Article submission sites
    Technology

    ReplyDelete
  18. Nice post. Thanks for sharing! I want people to know just how good this information is in your article. It’s interesting content and Great work.

    DataStage Online Training


    Dell Boomi Online Training


    DevOps Online Training


    Dot Net Online Training


    Ethical Hacking Online Training


    ETL Testing Online Training

    ReplyDelete
  19. This comment has been removed by the author.

    ReplyDelete
  20. This comment has been removed by the author.

    ReplyDelete
  21. Bu mhath leat gu bheil thu an-còmhnaidh toilichte agus fortanach. Tha sinn an dòchas gum bi barrachd artaigilean math agad.

    Phối chó bull pháp

    Phối giống chó Corgi

    Phối chó Pug

    Phối giống chó alaska

    ReplyDelete
  22. This is very interesting article thanx for your knowledge sharing.this is my website is mechanical Engineering related and one of best site .i hope you are like my website .one vista and plzz checkout my site thank you, sir.
    mechanical engineering

    ReplyDelete
  23. This comment has been removed by the author.

    ReplyDelete
  24. This is a decent post. This post gives genuinely quality data. I'm certainly going to investigate it. Actually quite valuable tips are given here. Much obliged to you to such an extent. Keep doing awesome. To know more information about
    Contact us :- https://www.login4ites.com/

    ReplyDelete
  25. It was a nice blog and The information is so effective in daily life. keep sharing this type of blogs. home elevators india | home lifts | HYdraulic elevators india | home Elevators

    ReplyDelete
  26. Thanks for Sharing this useful information. Get sharepoint apps development from veelead solutions

    ReplyDelete
  27. This comment has been removed by the author.

    ReplyDelete
  28. This comment has been removed by the author.

    ReplyDelete
  29. This comment has been removed by the author.

    ReplyDelete
  30. This comment has been removed by the author.

    ReplyDelete
  31. This comment has been removed by the author.

    ReplyDelete
  32. This comment has been removed by the author.

    ReplyDelete
  33. thanks for your article It's very nice and amazing. It's very usefulweb design company in velachery

    ReplyDelete
  34. Thanks for sharing an information to us.the Blog was very useful.If someone want to know about websites and SEO Service. I think this is the right place for you!
    Digital Marketing
    SEO company
    web-development
    Domain and Hosting

    ReplyDelete
  35. Great information was shared. It will be effective in the future and keep sharing. are you looking for the best home elevators in India? Click here to know more: Automatic gates India

    ReplyDelete
  36. This comment has been removed by the author.

    ReplyDelete
  37. Thanks for sharing your SQL knowledge to us. Keep updating. For more updates Visit Cloudi5

    ReplyDelete
  38. This comment has been removed by the author.

    ReplyDelete
  39. Nice Post thanks for the information, good information & very helpful for others,Thanks for Fantasctic blog and its to much informatic which i never think ..Keep writing and grwoing your self

    duplicate rc in delhi online
    duplicate rc in ghaziabad
    duplicate rc in online
    duplicate rc in greater noida
    duplicate rc in mumbai
    duplicate rc in bangalore
    duplicate rc in faridabad
    duplicate rc in gurgaon
    duplicate rc in noida
    death certificate online

    ReplyDelete
  40. Thanks for sharing a wonderful blog’s never get bored while I am reading you're a blog. I will stay connected with you for a future post.
    Angular Js Training in bangalore

    ReplyDelete
  41. Thanks for sharing a wonderful blog’s never get bored while I am reading you're the blog. I will stay connected with you for a future post.
    Angular js training in bangalore

    ReplyDelete
  42. manual testing tutorial
    Thanks for sharing this quality information with us. I really enjoyed reading. Visit to my blog Web Judi Online Terpercaya
    Thanks you sharing information.You can also visit on
    슬롯사이트
    해시게임
    1XBET토토사이트
    크레이지슬롯

    해시게임
    하이게이밍
    하나라이브
    파워볼사이트
    릴게임사이트

    ReplyDelete
  43. https://www.bedigitalpro.com/happy-new-year-2020/

    ReplyDelete
  44. Msbi is a business intelligene application tool to improve the business. learn on msbi throguh msbi online training

    ReplyDelete
  45. Hey Nice Blog!! Thanks For Sharing!!! Wonderful blog & good post. It is really very helpful to me, waiting for a more new post. Keep Blogging!Here is the angularjs online training with free Bundle videos .

    contact No :- 9885022027.

    ReplyDelete
  46. This is the web host that should be suggested to those who are paranoid about the speed of their site. This web host usually makes use of SSD servers that are lighting fast when compared to other disks used by other popular web host companies. If you want to get the Black Friday Hosting Deals 2019, then A2 is a preferred choice.

    ReplyDelete

  47. Nice post. I learn something totally new and challenging on websites I StumbleUpon every day. It's always useful to read through articles from other authors and practice something from other sites.


    Best Advanced Java Training In Bangalore Marathahalli

    Advanced Java Courses In Bangalore Marathahalli

    Advanced Java Training in Bangalore Marathahalli

    Advanced Java Training Center In Bangalore

    Advanced Java Institute In Marathahalli

    ReplyDelete
  48. Bollywood actor Ayushmann Khurrana has donned the uniform for his upcoming film Article 15. which releases this Friday. The movie is a strong take on casteism that prevails in parts of the nation. Helmed by Mulk director Anubhav Sinha, the film is a social commentary, wherein Ayushmann plays the leading man. Article 15 is the first film which features Ayushmann as a cop and that itself makes the movie a special addition to his career. "Uniform changes your posture in a way," Ayushmann commented while talking to us. In an exclusive conversation with BollywoodLife, the actor went on to elaborate on his experience of shooting Article 15. Ayushmann added, “Uniforms have a certain vibe, you need to have certain poise while you are wearing. I was already feeling different in the look test itself!”

    ReplyDelete
  49. I am a regular reader of your blog and I find it really informative. Hope more Articles From You.Best Tableau tutorial video available Here. hope more articles from you.

    ReplyDelete
  50. BSc in Optometry – Here is the details about Best BSc Optometry Colleges In Bangalore. If you are looking to study in Bangalore, the below link will redirect to a page that will show the best OPT colleges in Bangalore
    Optometry Colleges In Bangalore

    ReplyDelete
  51. We as a team of real-time industrial experience with a lot of knowledge in developing applications in python programming (7+ years) will ensure that we will deliver our best in python training in vijayawada. , and we believe that no one matches us in this context.

    ReplyDelete
  52. A digital coordinator is a person who administers digital projects for a company or enterprise. These professionals often focus on a range of tasks related to digital projects or products.
    ExcelR Digital Marketing Courses In Bangalore

    ReplyDelete
  53. This post is really nice and informative. The explanation given is really comprehensive and informative...

    software testing courses for beginners

    ReplyDelete
  54. That is a very good tip especially to those fresh to the blogosphere. Brief but very precise info… Thank you for sharing this one. A must read website article!

    ReplyDelete
  55. This is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious.

    aws tutorial for beginners
    aws training videos

    ReplyDelete

  56. Pretty article! I found some useful information in your blog, it was awesome to read, thanks for sharing this great content to my vision. i also want to share some infor mation regarding sap pp training and sap sd course.keep sharing.

    ReplyDelete


  57. This post is really nice and informative. The explanation given is really comprehensive and informative. I also want to say about the digital marketing training .

    ReplyDelete
  58. Awesome article, it was exceptionally helpful! I simply began in this and I'm becoming more acquainted with it better. The post is written in very a good manner and it contains many useful information for me. Thank you very much and will look for more postings from you.


    digital marketing blog
    digital marketing bloggers
    digital marketing blogs
    digital marketing blogs in india
    digital marketing blog 2020
    digital marketing blog sites
    skartec's digital marketing blog
    skartec's blog
    digital marketing course
    digital marketing course in chennai
    digital marketing training
    skartec digital marketing academy

    ReplyDelete

  59. I am reading your post from the beginning, it was so interesting to read & I feel thanks to you for posting such a good blog, keep updates regularly.i want to share about java online training and java training video .

    ReplyDelete


  60. Hello, I have gone through your post Its really awesome.Thats a great article. I am also want to share about advanced python course and python tutorial for beginners .thank you

    ReplyDelete
  61. Thanks for sharing such a great information..Its really nice and informative..

    best aws training in bangalore
    aws training videos

    ReplyDelete
  62. This is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious...

    sap workflow online training

    ReplyDelete

  63. Well thats a nice article.The information You providied is good . Here is i want to share about dell boomi training and Mulesoft Training videos . Expecting more articles from you .

    ReplyDelete

  64. Thanks for Sharing This Article.It is very so much valuable content. I hope these Commenting lists will help to my website
    blockchain online training
    best blockchain online training
    top blockchain online training

    ReplyDelete
  65. Amazing post, Thank you for presenting a wide variety of information that is very interesting to see in this artikle
    Home elevators Melbourne | Home lifts

    ReplyDelete
  66. This is so elegant and logical and clearly explained. Brilliantly goes through what could be a complex process and makes it obvious.

    azure training

    ReplyDelete
  67. Nice article I was really impressed by seeing this blog, it was very interesting and it is very useful for me. | Home elevators Malaysia

    ReplyDelete
  68. Nice article. For offshore hiring services visit:
    fairygodboss

    ReplyDelete
  69. Thanks for giving great kind of information. So useful and practical for me. Home elevators Dubai

    ReplyDelete
  70. It's really a nice and useful piece of information about Angular Js. I'm satisfied that you shared this helpful information with us.Please keep us informed like this. Thank you for sharing.


    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ReplyDelete
  71. Effective blog with a lot of information. I just Shared you the link below for Courses .They really provide good level of training and Placement,I just Had SQL Server Classes in this institute , Just Check This Link You can get it more information about the SQL Server course.



    Java training in chennai | Java training in annanagar | Java training in omr | Java training in porur | Java training in tambaram | Java training in velachery

    ReplyDelete
  72. RichestSoft is a full-service interactive agency that combines practical strategies with results off the ground. Since 2007, we have been working with dozens of companies of all sizes to expand their business opportunities through technology.
    website development company in india
    best website designing company in india
    mobile app development company in india

    ReplyDelete
  73. I never used all the features of Garmin Nuvi 265w . But still I can say that this is the best app I have ever used. Garnim Nuvi comes with some refined features. Check out Garmin Nuvi or call +1-888-309-0939 for instant help from Garmin GPS experts.

    ReplyDelete
  74. Hi!!!
    Hey Wonder full Blog! Thanks for this valuable Information Sharing with us your review is very nice.
    Thanks once again for this Wonderful article. Waiting for a more new post
    Keep on posting!

    Digital Marketing Agency in Coimbatore
    SEO Company in Coimbatore
    web designing Company in coimbatore

    ReplyDelete
  75. thanks for your article.very great blog.We are the Best Digital Marketing Agency in Chennai, Coimbatore, Madurai and change makers of digital! For Enquiry Contact us @+91 9791811111

    Website designers in chennai | digital marketing agencies in chennai |digital marketing consultants in chennai | Best seo company in chennai | Best SEO Services in Chennai

    ReplyDelete
  76. great poster blog.We are the Best Digital Marketing Agency in Chennai, Coimbatore, Madurai and change makers of digital! For Enquiry Contact us @+91 9791811111

    Website designers in chennai | digital marketing agencies in chennai |digital marketing consultants in chennai | Best seo company in chennai | Best SEO Services in Chennai

    ReplyDelete
  77. For those who want Government Jobs Latest Update and news, this is the website to come. You can check here for the latest updates about govt job. On this website you can found All India Govt Jobs Employment News of Central and State Government Jobs, Govt Undertaking, Public Sector, Railway and Bank Jobs In India.
    Army Recruitment
    Railway Jobs in India
    Teaching Jobs
    Govt Engineering Jobs
    Bank Jobs in India
    State Government Jobs

    ReplyDelete
  78. Really nice post. Thank you for sharing amazing information. Searching for cheap India based real instagram followers services, than best to Buy instagram followers India without any hassle.

    ReplyDelete
  79. Great post I would like to thank you for the efforts you have made in writing this interesting and knowledgeable article Golden Triangle Tour Packages Thanks for sharing your information.

    ReplyDelete
  80. Hey are you looking for an cheap Video Agency company in Belgium, France, and, UK. I bet you our rate are cheaper than the market and no compromise in the quality of work.

    We are offering top services in low rates

    Motion Design Agency
    Video Agency
    Digital Marketing Agency
    Video Marketing
    Social Media Marketing
    Pay per click campaign

    ReplyDelete
  81. I really happy found this website eventually. Really informative I am Sharing a website where you can get the latest anavar

    ReplyDelete
  82. Dear Team,
    Thanks for this useful content. Get to know more about digital marketing @ https://www.thirdlaw.in/effective-multichannel-digital-marketing-strategy-evolving-digital-marketing-solutions-for-business/

    ReplyDelete
  83. I really happy found this website eventually.

    ReplyDelete
  84. I really happy found this website eventually. Really informative I am Sharing a website where you can get the latest visit website

    ReplyDelete
  85. Web smoothing out infers the way toward making a site persistently detectable on a web crawler's outcomes page. To explain, a faltering SEO reasoning will put an affiliation's site at the head of the rundown on a Google search page, thusly improving the probability that individuals will visit the site.



    https://5euros.eu/profil/sabine45

    ReplyDelete
  86. nice article I would like to thank the author
    https://www.krishnawellness.com/

    ReplyDelete
  87. it's a very helpful article for us thanks for sharing with us
    https://www.apponix.com/Digital-Marketing-Institute/Digital-Marketing-Training-in-Bangalore.html

    ReplyDelete
  88. Excellent Blog, it has been interesting. Visit Ogen Infosystem for the best Website Designing services in Delhi, India.
    Web Design Company

    ReplyDelete
  89. Nice information, valuable and excellent work, as share good stuff with good ideas and concepts. oracle training in chennai

    ReplyDelete
  90. great article blog .keep posting like this.thanks.River Group of Salon and spa, T.Nagar, provide a wide range of spa treatments, like body massage, scrub, wrap and beauty parlour services. We ensure unique care and quality service.

    massage in T.Nagar | body massage T.Nagar | massage spa in T.Nagar | body massage center in T.Nagar | massage centre in chennai | body massage in chennai | massage spa in chennai | body massage centre in chennai | full body massage in T.Nagar

    ReplyDelete
  91. Thanks for your information, you have given very useful and important information.


    AngularJS Onlinetraining

    ReplyDelete
  92. Are you looking for reliable packers and moving companies in Chandigarh? If so, your search ends here. It is located on the corresponding website here: Kstarpackers, a trusted online medium that offers free quotes from the best packers and freight forwarders in Chandigarh.

    https://www.kstarpackers.com/packers-and-movers-chandigarh/

    ReplyDelete