এসকিউএল সার্ভার টি-এসকিউএল-এ নিয়মিত প্রকাশ


127

SPএসকিউএল সার্ভারের জন্য টি-এসকিউএল (কোনও সিএলআর, কোনও প্রসারিত , খাঁটি টি-এসকিউএল) তে কোনও নিয়মিত অভিব্যক্তি গ্রন্থাগার লেখা আছে এবং সেগুলি ভাগ করে নেওয়া হোস্টিংয়ের সাথে কাজ করা উচিত?

সম্পাদনা:

  • ধন্যবাদ, আমি সম্পর্কে জানতে PATINDEX, LIKE, xp_ spsএবং CLR সমাধান
  • আমি আরও জানি এটি রেগেক্সের পক্ষে সেরা জায়গা নয়, প্রশ্নটি তাত্ত্বিক :)
  • হ্রাস কার্যকারিতা এছাড়াও গৃহীত হয়

2
আমারও এই প্রশ্ন আছে। আমি জানি যে এটির জন্য কোনও ডাটাবেসই সেরা জায়গা নয় তবে বাস্তবতাটি হ'ল অন্যান্য সমাধানগুলিতে সার্ভারটি পুনরায় কনফিগার করার জন্য এসকিউএল প্রশাসকের অনুমতি প্রয়োজন। দুর্ভাগ্যক্রমে, আমাদের কিছু ক্লায়েন্ট সিএলআর ইত্যাদি সক্ষম করতে পছন্দ করবেন না এবং আমরা কেবল ডাটাবেস-সমাধানগুলিতে আটকে আছি।
পল ড্রাগার

@ পলড্রেপার এবং এক্সনাগিগ: এসকিউএলসিআরআরকে কেন বাতিল করবেন? এটি অনুসন্ধানগুলিতে নিয়মিত অভিব্যক্তি পাওয়ার সবচেয়ে উপযুক্ত মাধ্যম। এবং কেন আপনার কিছু ক্লায়েন্ট সিএলআর সক্ষম করবেন না? আমি এখনও একটি বৈধ কারণ অতিক্রম করতে পারেন । অবশ্যই, আমি "সুরক্ষা" এবং "পারফরম্যান্স" শুনি, তবে এসকলকিউএলআর কীভাবে কাজ করে এবং কীভাবে এটি সীমাবদ্ধ করা যায় তা না বুঝার ফলস্বরূপ এটি বোকাস।
সলোমন রুটজকি

3
@ শ্রুতজকি: সর্বাধিক ভাগ করা হোস্টিং সরবরাহকারী সিএলআর অনুমতি দেয় না। আপনার তাদের "সুরক্ষা" এবং "পারফরম্যান্স" সম্পর্কে জিজ্ঞাসা করা উচিত :)
xgnyg

@ এক্সনগাইগ অবশ্যই, আমি কয়েকটি জিজ্ঞাসা করতে পারি। যাইহোক, একটি গোষ্ঠীর আচরণের দিকে ইঙ্গিত করা কোনওভাবেই সেই আচরণের "কোনও বৈধ কারণ আছে" এর প্রশ্নটি সম্বোধন করে না। এটি ঠিক তত সহজেই হতে পারে যে ভাগ করা হোস্টিং সরবরাহকারীরা সকলেই একই ভুল বোঝাবুঝির ভিত্তিতে তাদের নীতি সেট করে। এবং যদি অন্য কিছু না হয় তবে সাধারণ সত্য যে তাদের সমস্ত এসকিউএলসিএলআরকে অস্বীকার করে না তারা আসলে সেখানে সমস্যা হওয়ার ধারণার চেয়ে বেশি সমস্যা না হওয়ার ধারণাকে সমর্থন করে যেহেতু যদি সেই সমস্যাগুলি উপস্থিত না থাকে তবে এসকিউএলসিআরআরকে সরবরাহকারীরা অভিজ্ঞতা অর্জন করবে এই সমস্যাগুলি এবং এটির অনুমতি দেওয়া বন্ধ করবে।
সলোমন রুটজকি

@ এক্সনাগইগ এছাড়াও, আমার স্পষ্ট করে বলা উচিত যে আমি যে সমাবেশগুলি হিসাবে চিহ্নিত SAFEএবং চিহ্নিত না করে চিহ্নিত করেছি সে হিসাবে আমি কথা বলছি EXTERNAL_ACCESSবা UNSAFE(যেমন আমি বুঝতে পারি না যে কেন 2 ভাগ পরের অনুমতিসেটগুলি ভাগ করে নেওয়া হোস্টিং পরিবেশের জন্য সমস্যাযুক্ত হবে)। মাইক্রোসফ্ট অ্যাজুরে এসকিউএল ডেটাবেস ভি 12 (অর্থাত্ 2014 সালের শেষের দিকে নতুন সংস্করণ), যা একটি ভাগ করা পরিবেশ, এসেম্বলিগুলিকে চিহ্নিত হিসাবে চিহ্নিত করা হয় SAFE(এবং FROM 0x...আপনি কোনও ডিএলএল আপলোড করতে পারবেন না বলে কোনও ডিএলএল পরিবর্তে এর মাধ্যমে লোড করা হয়)। তবে SAFEনিয়মিত এক্সপ্রেশন এবং অন্যান্য খুব দরকারী ফাংশনের প্রচুর লটগুলির জন্য যা যা প্রয়োজন তা হ'ল।
সলোমন রুটজকি

উত্তর:


77

কেমন হয় PATINDEX ফাংশন আছে?

টিএসকিউএলে মিলিত প্যাটার্নটি কোনও সম্পূর্ণ রেগেক্স লাইব্রেরি নয়, তবে এটি আপনাকে বেসিক দেয়।

(অনলাইন বই থেকে)

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
কমপক্ষে এক দশকের জন্য (এসকিউএল সার্ভার 2005+) LIKEসমস্ত PATINDEXকিছু সমর্থন করে। এর আগে জেনে নেই ...
টিজে ক্রোডার

1
তবুও এটি আমাকে এমন একটি প্যাটার্ন নির্দিষ্ট করতে দেয় না যা আস্কি বর্ণগুলির একটি পরিবর্তনশীল সংখ্যার সাথে মেলে say %0 বা ততোধিক অক্ষর মেলে (নির্বিশেষে), [...]কেবল একটির সাথে মেলে এবং এর মধ্যে কিছুই নেই।
মার্টিজন পিটারস

পছন্দ যেমন প্যাটিনডেক্স> 0
বিপরীত প্রকৌশলী

21

যদি কেউ এখানে সিএলআর দিয়ে রেজেক্স ব্যবহার করতে আগ্রহী হয় তবে এটি একটি সমাধান। নীচের ফাংশনটি (সি #। নেট 4.5) প্যাটার্নটি মেলে থাকলে 1 এবং প্যাটার্নটি মেলে না থাকলে 0 প্রদান করে। আমি সাব কোয়েরিতে লাইন ট্যাগ করতে এটি ব্যবহার করি। এসকিউএল ফাংশন বৈশিষ্ট্যটি এসকিউএল সার্ভারকে বলে যে এই পদ্ধতিটি আসল ইউডিএফ যা এসকিউএল সার্ভার ব্যবহার করবে। ফাইলটিকে এমন জায়গায় একটি ডেল হিসাবে সংরক্ষণ করুন যেখানে আপনি এটি পরিচালনা স্টুডিও থেকে অ্যাক্সেস করতে পারবেন।

// 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 এর সাথে মেলে ... এমএসডিএন সাইটে আরও তথ্য রয়েছে ।


5

আপনি এসকিউএল সার্ভার 2016 অথবা উপরে ব্যবহার করে থাকেন, আপনি ব্যবহার করতে পারেন sp_execute_external_scriptআর সহ এটা যেমন রেগুলার এক্সপ্রেশন অনুসন্ধান, জন্য ফাংশন আছে grepএবং grepl

ইমেল ঠিকানাগুলির জন্য এখানে একটি উদাহরণ। আমি এসকিউএল সার্ভার ডাটাবেস ইঞ্জিনের মাধ্যমে কিছু "লোক" কে জিজ্ঞাসা করব, এই লোকগুলির ডেটা আরে প্রেরণ করব, কোনটি লোকের অবৈধ ইমেল ঠিকানা রয়েছে তা আর, এবং আর-এস-এসকিউএল সার্ভারে লোকের উপসেটটি আর দিয়ে দিতে হবে। "মানুষ" নমুনা ডাটাবেসের [Application].[People]টেবিল থেকে [WideWorldImporters]। নামের একটি ডেটাফ্রেম হিসাবে তারা আর ইঞ্জিনে পাস হয় InputDataSet। আরজিএক্স স্ট্রিং অনুসন্ধানের ধরণটির সাথে মেলে না এমন কোন ইমেল ঠিকানা রয়েছে তা খুঁজে পেতে "না" অপারেটর (বিস্মৃতি বিন্দু) দিয়ে গ্রেপ ফাংশন ব্যবহার করে।

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)))

নোট করুন যে উপযুক্ত বৈশিষ্ট্যগুলি এসকিউএল সার্ভার হোস্টে ইনস্টল করা আবশ্যক। এসকিউএল সার্ভার 2016 এর জন্য, এটি "এসকিউএল সার্ভার আর পরিষেবাগুলি" নামে পরিচিত। এসকিউএল সার্ভার 2017 এর জন্য এটির নামকরণ করা হয়েছিল "এসকিউএল সার্ভার মেশিন লার্নিং সার্ভিসেস"।

সমাপ্তি চিন্তা মাইক্রোসফ্টের এসকিউএল (টি-এসকিউএল) প্রয়োগের রেজিএক্সের নেটিভ সমর্থন নেই। এই প্রস্তাবিত সমাধানটি সিএলআর সঞ্চিত পদ্ধতি ব্যবহারের চেয়ে ওপিতে আর কাম্য হতে পারে না। তবে এটি সমস্যার কাছে যাওয়ার আরও একটি উপায় সরবরাহ করে।


4

অন্য কেউ যদি এখনও এই প্রশ্নটির দিকে তাকাচ্ছেন তবে http://www.sqlsharp.com/ আপনার ডেটাবেজে নিয়মিত প্রকাশ সিএলআর ফাংশন যুক্ত করার একটি নিখরচায়, সহজ উপায়


3
আবারও, আমি একটি সিএলআর সমাধান করব - ওপি যা চেয়েছিল তা নয়
বিপরীত প্রকৌশলী

10
@ ডেভবোল্টম্যান: তিনি ২০০৮ সালে প্রশ্নটি জিজ্ঞাসা করেছিলেন People লোকেরা মাঝে মধ্যে এটি অনুসন্ধান করে এবং সিএলআর এড়াতে না চান এই প্রশ্নটি চালিয়ে যায়। এটি আমাকে সাহায্য করেছে এবং তাদের সহায়তা করতে পারে।
জন ফিশার

নিশ্চিত, আমি আপনার সাথে @JohnFisher একমত না - এটি হল কেউ CLR ব্যবহার করার জন্য একটি সহায়ক উত্তর। তবে ২০১৫ সালে, আমরা এখনও বিভিন্ন কারণে এসকিউএল প্রকল্পের কোনও এসকিউএল সমাধান চাই (কোনও সিএলআর নেই) ঠিক যেমন ওপি ২০০৮ সালে করেছিল The বছরটি কোনও ব্যাপার নয় :) উদাহরণস্বরূপ আপনার গাড়ীর ব্যাটারিটি মুক্তি পেয়েছিল 1859 । তবে আপনি এখনও আরও আধুনিক ব্যাটারি যেমন এনিএমএইচ ব্যাটারি 100 বছরেরও বেশি পরে প্রকাশিত বিভিন্ন কারণে (যেমন কোনও গাড়ি
চালাতে

2
@ ডেভবোল্টম্যান: আপনি সেই অংশটি মিস করেছেন যেখানে "লোকেরা মাঝে মধ্যে এটি সন্ধান করে এবং সিএলআর এড়াতে না চেয়ে এই প্রশ্নটি চালিয়ে যায়"। এটি মূল বিষয় ছিল।
জন ফিশার

নিশ্চিত - আপনি ঠিক @ জনফিশার, আপনি এটি বলেছিলেন। খুশি হয়ে এটি আপনাকে সহায়তা করেছে এবং আমি নিশ্চিত যে এটি অন্যকেও সহায়তা করবে
বিপরীত প্রকৌশলী

2

আপনি ওএলই অটোমেশন ব্যবহার করে ভিবিএস স্ক্রিপ্ট নিয়মিত অভিব্যক্তি বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন। এটি কোনও সমাবেশ তৈরি এবং বজায় রাখার ওভারহেডের চেয়ে ভাল। দয়া করে নিশ্চিত করুন যে আপনি মূলটির আরও ভাল সংশোধিত সংস্করণটি পেতে মন্তব্য বিভাগে যাচ্ছেন।

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পদ্ধতি সম্পর্কে আরও তথ্য এখানে পাওয়া যায়

শুভ কোডিং


স্যার, আমি জানি এটি পুরানো, কিন্তু: কেন ওএলই-র মাধ্যমে ভিবিএস স্ক্রিপ্ট সিএলআর চেয়ে "উপায় ভাল"? আপনি যদি কেবল রক্ষণাবেক্ষণ সম্পর্কে চিন্তা করেন তবে আপনি সঠিক হতে পারবেন, তবে পারফরম্যান্সের কী হবে?
SWE

1
@swe 'আরও ভালভাবে' দ্বারা, আমি কেবল এই উদ্দেশ্যে একটি নেট নেট সমাবেশ তৈরি ও রক্ষণাবেক্ষণের ওভারহেডের কারণে বাঁচানো সময়কে উল্লেখ করছি।
জেমস পোলুস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.