SQL सर्वर T-SQL में नियमित अभिव्यक्ति


127

SPएसक्यूएल सर्वर के लिए टी-एसक्यूएल (कोई सीएलआर, कोई विस्तारित , शुद्ध टी-एसक्यूएल) में कोई नियमित अभिव्यक्ति पुस्तकालय नहीं है और क्या यह साझा होस्टिंग के साथ काम करना चाहिए?

संपादित करें:

  • धन्यवाद, मैं के बारे में पता PATINDEX, LIKE, xp_ spsऔर CLR समाधान
  • मुझे यह भी पता है कि यह रेगेक्स के लिए सबसे अच्छी जगह नहीं है, सवाल सैद्धांतिक है :)
  • कम कार्यक्षमता भी स्वीकार की जाती है

2
मेरा भी यह सवाल है। मुझे पता है कि ऐसा करने के लिए एक डेटाबेस सबसे अच्छी जगह नहीं है, लेकिन वास्तविकता यह है कि अन्य समाधानों के लिए सर्वर को फिर से कॉन्फ़िगर करने के लिए SQL व्यवस्थापक अनुमतियों की आवश्यकता होती है। दुर्भाग्य से, हमारे कुछ ग्राहक सीएलआर इत्यादि को सक्षम करने का विकल्प नहीं चुनेंगे, और हम केवल डेटाबेस समाधान के लिए ही अटके हुए हैं।
पॉल ड्रेपर

@PaDDperper और xnagyg: SQLCLR को नियमबद्ध क्यों करें? यह प्रश्नों में रेगुलर एक्सप्रेशन प्राप्त करने का सबसे उपयुक्त साधन है। और आपके कुछ ग्राहक सीएलआर को सक्षम न करने का विकल्प क्यों चुनेंगे? मुझे अभी तक एक वैध कारण नहीं है। निश्चित रूप से, मैं "सुरक्षा" और "प्रदर्शन" सुनता हूं, लेकिन वे फर्जी कारण हैं जो यह समझने का परिणाम नहीं हैं कि SQLCLR कैसे काम करता है और इसे कैसे प्रतिबंधित किया जा सकता है।
सोलोमन रटज़की

3
@srutzky: अधिकांश साझा होस्टिंग प्रदाता सीएलआर की अनुमति नहीं देता है। आपको उनसे "सुरक्षा" और "प्रदर्शन" के बारे में पूछना चाहिए :)
xnagyg

@xnagyg ज़रूर, मैं कुछ पूछ सकता हूं। हालांकि, किसी समूह के व्यवहार की ओर इशारा करना किसी भी तरह से उस व्यवहार के लिए " वहाँ एक वैध कारण है" के सवाल को संबोधित नहीं करता है। यह आसानी से हो सकता है कि उन सभी साझा होस्टिंग प्रदाताओं ने अपनी नीति को एक ही गलतफहमी के आधार पर निर्धारित किया है। और, यदि और कुछ नहीं, साधारण तथ्य यह है कि नहीं सभी SQLCLR वास्तव में वहाँ के विचार का समर्थन करता है उनमें से नामंज़ूर नहीं एक समस्या में कोई समस्या होने का विचार अधिक से अधिक किया जा रहा है के बाद से ही उन समस्याओं अस्तित्व था, प्रदाताओं कि SQLCLR का सामना किया जाएगा अनुमति देते हैं उन समस्याओं और यह अनुमति देना बंद कर देगा।
सोलोमन रटज़की

@xnagyg इसके अलावा, मुझे स्पष्ट करना चाहिए कि मैं असेंबली के रूप में चिह्नित के रूप में बोल रहा हूं SAFEऔर EXTERNAL_ACCESSया तो चिह्नित नहीं किया गया है या UNSAFE(जैसा कि मुझे समझ में नहीं आता है कि उन 2 बाद के अनुमति समूह साझा होस्टिंग वातावरण के लिए समस्याग्रस्त क्यों होंगे)। Microsoft Azure SQL डेटाबेस V12 (यानी 2014 के अंत में नया संस्करण), जो कि एक साझा वातावरण है, असेंबली को एक DLL से अपलोड करने के बाद से SAFE(और FROM 0x...एक DLL के बजाय लोड के माध्यम से चिह्नित) की अनुमति देता है । लेकिन SAFEवह सब है जो नियमित रूप से अभिव्यक्त करने और अन्य बहुत उपयोगी कार्यों के लिए आवश्यक है।
सोलोमन रटज़की

जवाबों:


77

PATINDEX फ़ंक्शन के बारे में कैसे ?

TSQL में मिलान करने वाला पैटर्न पूर्ण रीजेक्स लाइब्रेरी नहीं है, लेकिन यह आपको मूल बातें बताता है।

(ऑनलाइन पुस्तकों से)

Wildcard  Meaning  
% Any string of zero or more characters.

_ Any single character.

[ ] Any single character within the specified range 
    (for example, [a-f]) or set (for example, [abcdef]).

[^] Any single character not within the specified range 
    (for example, [^a - f]) or set (for example, [^abcdef]).

7
कम से कम एक दशक (SQL Server 2005+) के लिए, LIKEसब कुछ का समर्थन किया PATINDEXहै। उससे पहले के बारे में नहीं जानते ...
TJ Crowder

1
फिर भी यह मुझे एक ऐसे पैटर्न को निर्दिष्ट नहीं करता है, जो एससीआई अक्षरों की एक चर संख्या से मेल खाता है, कहते हैं। %0 या अधिक वर्णों (चाहे) से [...]मेल खाता है , केवल एक से मेल खाता है, और बीच में कुछ भी नहीं है।
मार्टिन पीटर्स


21

अगर कोई CLR के साथ रेगेक्स का उपयोग करने में रुचि रखता है तो यहां एक समाधान है। नीचे फ़ंक्शन (C # .net 4.5) एक 1 लौटाता है यदि पैटर्न का मिलान किया जाता है और यदि पैटर्न से मेल नहीं खाता है तो एक 0। मैं इसका उपयोग उप प्रश्नों में टैग लाइनों के लिए करता हूं। SQLfunction विशेषता SQL सर्वर को बताती है कि यह विधि वास्तविक UDF है जिसका उपयोग SQL सर्वर करेगा। फ़ाइल को उस स्थान पर dll के रूप में सहेजें जहां आप इसे प्रबंधन स्टूडियो से एक्सेस कर सकते हैं।

// default using statements above
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;

namespace CLR_Functions
{   
    public class myFunctions
    {
        [SqlFunction]
        public static SqlInt16 RegexContain(SqlString text, SqlString pattern)
        {            
            SqlInt16 returnVal = 0;
            try
            {
                string myText = text.ToString();
                string myPattern = pattern.ToString();
                MatchCollection mc = Regex.Matches(myText, myPattern);
                if (mc.Count > 0)
                {
                    returnVal = 1;
                }
            }
            catch
            {
                returnVal = 0;
            }

            return returnVal;
        }
    }
}

प्रबंधन स्टूडियो में dll फ़ाइल को प्रोग्रामबिलिटी - असेंबली - नई असेंबली के माध्यम से आयात करते हैं

फिर इस क्वेरी को चलाएं:

CREATE FUNCTION RegexContain(@text NVARCHAR(50), @pattern NVARCHAR(50))
RETURNS smallint 
AS
EXTERNAL NAME CLR_Functions.[CLR_Functions.myFunctions].RegexContain

फिर आपके पास उस फ़ंक्शन के लिए पूर्ण पहुंच होनी चाहिए, जिस डेटाबेस में आपने असेंबली को संग्रहीत किया था।

फिर प्रश्नों में उपयोग करें:

SELECT * 
FROM 
(
    SELECT
        DailyLog.Date,
        DailyLog.Researcher,
        DailyLog.team,
        DailyLog.field,
        DailyLog.EntityID,
        DailyLog.[From],
        DailyLog.[To],
        dbo.RegexContain(Researcher, '[\p{L}\s]+') as 'is null values'
    FROM [DailyOps].[dbo].[DailyLog]
) AS a
WHERE a.[is null values] = 0

14

LIKE का उपयोग करके कुछ बुनियादी पैटर्न उपलब्ध है, जहाँ% किसी भी संख्या और वर्णों के संयोजन से मेल खाता है, _ किसी भी एक वर्ण से मेल खाता है, और [abc] a, b, या c से मेल खा सकता है ... MSDN साइट पर अधिक जानकारी है ।


5

यदि आप SQL Server 2016 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो आप sp_execute_external_scriptR के साथ-साथ उपयोग कर सकते हैं । इसमें रेग्युलर एक्सप्रेशन खोजों जैसे grepऔर के लिए फ़ंक्शन हैं grepl

यहां ईमेल पतों के लिए एक उदाहरण दिया गया है। मैं SQL सर्वर डेटाबेस इंजन के माध्यम से कुछ "लोगों" को क्वेरी करूंगा, उन लोगों के लिए डेटा को R पास करें, R को निर्णय लेने दें कि किन लोगों के पास अवैध ईमेल पते हैं, और R पास है जो कि SQL सर्वर से लोगों का सबसेट है। "लोग" नमूना डेटाबेस [Application].[People]में तालिका से हैं [WideWorldImporters]। वे आर इंजन के पास एक डेटाफ्रेम नाम से जाते हैं InputDataSet। R "नहीं" ऑपरेटर (विस्मयादिबोधक बिंदु!) के साथ grepl फ़ंक्शन का उपयोग करता है यह जानने के लिए कि लोगों के पास ईमेल पते हैं जो RegEx स्ट्रिंग खोज पैटर्न से मेल नहीं खाते हैं।

EXEC sp_execute_external_script 
 @language = N'R',
 @script = N' RegexWithR <- InputDataSet;
OutputDataSet <- RegexWithR[!grepl("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))", RegexWithR$EmailAddress), ];',
 @input_data_1 = N'SELECT PersonID, FullName, EmailAddress FROM Application.People'
 WITH RESULT SETS (([PersonID] INT, [FullName] NVARCHAR(50), [EmailAddress] NVARCHAR(256)))

ध्यान दें कि SQL सर्वर होस्ट पर उपयुक्त सुविधाएँ स्थापित होनी चाहिए। SQL Server 2016 के लिए, इसे "SQL Server R सेवाएँ" कहा जाता है। SQL सर्वर 2017 के लिए, इसे "SQL सर्वर मशीन लर्निंग सर्विसेज" का नाम दिया गया था।

समापन विचार Microsoft के SQL के कार्यान्वयन (T-SQL) में RegEx के लिए मूल समर्थन नहीं है। यह प्रस्तावित समाधान ओपी के लिए सीएलआर संग्रहित प्रक्रिया के उपयोग से अधिक वांछनीय नहीं हो सकता है। लेकिन यह समस्या के लिए एक अतिरिक्त तरीका प्रदान करता है।


4

यदि कोई अन्य व्यक्ति अभी भी इस प्रश्न को देख रहा है, तो http://www.sqlsharp.com/ अपने डेटाबेस में नियमित अभिव्यक्ति सीएलआर कार्यों को जोड़ने का एक नि: शुल्क, आसान तरीका है


3
एक बार फिर, मैं एक सीएलआर समाधान हूं - न कि ओपी ने क्या पूछा
उल्टा अभियंता

10
@DaveBoltman: उन्होंने 2008 में सवाल पूछा था। लोग कभी-कभी इसे खोजते हैं और सीएलआर से बचने के लिए इस सवाल के बिना भागते हैं। इससे मुझे मदद मिली और मैं उनकी मदद कर सकता हूं।
जॉन फिशर

बेशक, मैं तुम्हारे साथ @JohnFisher सहमत हैं - यह है किसी CLR का उपयोग कर के लिए एक उपयोगी जवाब। लेकिन 2015 में, हम एक एसक्यूएल केवल विभिन्न कारणों के लिए हमारे एसक्यूएल परियोजना (कोई CLR) में समाधान की तरह अभी भी चाहते हैं, जैसे ओपी 2008 में किया था साल नहीं है बात :) जैसे अपनी कार में बैटरी गया था में जारी 1859 । लेकिन आप अभी भी अधिक आधुनिक बैटरी जैसे कि NiMH बैटरी को 100 से अधिक वर्षों के बाद जारी करने से बचना पसंद करेंगे, विभिन्न कारणों से (जैसे कि कार को वहन करने में सक्षम होना :)
उल्टे इंजीनियर

2
@DaveBoltman: आप उस हिस्से से चूक गए जहां "लोग कभी-कभी इसे खोजते हैं और सीएलआर से बचने के लिए इस सवाल के बिना भागते हैं"। यह प्रमुख बिंदु था।
जॉन फिशर

सुनिश्चित करें - आप सही हैं @ जॉनफ़ायर, आपने ऐसा कहा था। खुशी है कि इसने आपकी मदद की, और मुझे यकीन है कि यह दूसरों की भी मदद करेगा
उल्टा इंजीनियर

2

आप OLE स्वचालन का उपयोग करके VBScript नियमित अभिव्यक्ति सुविधाओं का उपयोग कर सकते हैं। यह विधानसभा बनाने और बनाए रखने के ओवरहेड से बेहतर है। कृपया सुनिश्चित करें कि आप मुख्य अनुभाग का एक बेहतर संशोधित संस्करण प्राप्त करने के लिए टिप्पणी अनुभाग के माध्यम से जाते हैं।

http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx

DECLARE @obj INT, @res INT, @match BIT;
DECLARE @pattern varchar(255) = '<your regex pattern goes here>';
DECLARE @matchstring varchar(8000) = '<string to search goes here>';
SET @match = 0;

-- Create a VB script component object
EXEC @res = sp_OACreate 'VBScript.RegExp', @obj OUT;

-- Apply/set the pattern to the RegEx object
EXEC @res = sp_OASetProperty @obj, 'Pattern', @pattern;

-- Set any other settings/properties here
EXEC @res = sp_OASetProperty @obj, 'IgnoreCase', 1;

-- Call the method 'Test' to find a match
EXEC @res = sp_OAMethod @obj, 'Test', @match OUT, @matchstring;

-- Don't forget to clean-up
EXEC @res = sp_OADestroy @obj;

यदि आपको SQL Server blocked access to procedure 'sys.sp_OACreate'...त्रुटि मिलती है, तो sp_reconfigureसक्षम करने के लिए उपयोग करें Ole Automation Procedures। (हाँ, दुर्भाग्य से यह सर्वर स्तर का बदलाव है!)

Testविधि के बारे में अधिक जानकारी यहाँ उपलब्ध है

खुश कोडिंग


sry, मुझे पता है कि यह पुराना है, लेकिन: CLR की तुलना में OLE "बेहतर तरीके से" के माध्यम से VBScript क्यों है? यदि आप केवल रखरखाव के बारे में सोचते हैं, तो आप सही होंगे, लेकिन प्रदर्शन के बारे में क्या?
दुर्भाग्य

1
@swe 'बेहतर तरीके से', मैं सिर्फ इस उद्देश्य के लिए एक .NET असेंबली बनाने और बनाए रखने के ओवरहेड के कारण बचाए गए समय का उल्लेख कर रहा था।
जेम्स पौलोज ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.