আমি জানি এটি খুব দেরী হয়েছে, তবে আমারও একই অবস্থা ছিল। আমার কাছে সংরক্ষিত পদ্ধতিগুলির সেটগুলির জন্য আমার "লাইক ইন" অপারেটরের দরকার ছিল যা অনেকগুলি পরামিতি গ্রহণ করে এবং তারপরে একাধিক আরডিবিএমএস সিস্টেম থেকে ডেটা সংগ্রহের জন্য সেই পরামিতিগুলি ব্যবহার করে, সুতরাং কোনও আরডিবিএমএস-নির্দিষ্ট কৌশল কাজ করবে না, তবে সঞ্চিত পদ্ধতি এবং কোনও ফাংশন এমএস এসকিউএল সার্ভারে চলবে, তাই আমরা প্রতিটি আরডিবিএমএসের জন্য সম্পূর্ণ এসকিউএল স্টেটমেন্ট জেনারেশনের কার্যকারিতার জন্য টি-এসকিউএল ব্যবহার করতে পারি, তবে আউটপুটটি মোটামুটি আরডিবিএমএস-স্বতন্ত্র হওয়া দরকার।
আমি এই মুহুর্তে একটি সীমানাযুক্ত স্ট্রিং (যেমন কোনও প্যারামিটার একটি সঞ্চিত পদ্ধতিতে আসা) এসকিউএল-এর একটি ব্লকে পরিণত করার জন্য এসেছি। আমি এটি "লাইক ইন" এর জন্য "লাইচেন" বলি। এটা নাও?
Lichen.sql
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =======================================================================
-- Lichen - Scalar Valued Function
-- Returns nvarchar(512) of "LIKE IN" results. See further documentation.
-- CREATOR: Norman David Cooke
-- CREATED: 2020-02-05
-- UPDATED:
-- =======================================================================
CREATE OR ALTER FUNCTION Lichen
(
-- Add the parameters for the function here
@leadingAnd bit = 1,
@delimiter nchar(1) = ';',
@colIdentifier nvarchar(64),
@argString nvarchar(256)
)
RETURNS nvarchar(512)
AS
BEGIN
-- Declare the return variable here
DECLARE @result nvarchar(512)
-- set delimiter to detect (add more here to detect a delimiter if one isn't provided)
DECLARE @delimit nchar(1) = ';'
IF NOT @delimiter = @delimit
SET @delimit = @delimiter
-- check to see if we have any delimiters in the input pattern
IF CHARINDEX(@delimit, @argString) > 1 -- check for the like in delimiter
BEGIN -- begin 'like in' branch having found a delimiter
-- set up a table variable and string_split the provided pattern into it.
DECLARE @lichenTable TABLE ([id] [int] IDENTITY(1,1) NOT NULL, line NVARCHAR(32))
INSERT INTO @lichenTable SELECT * FROM STRING_SPLIT(@argString, ';')
-- setup loop iterators and determine how many rows were inserted into lichen table
DECLARE @loopCount int = 1
DECLARE @lineCount int
SELECT @lineCount = COUNT(*) from @lichenTable
-- select the temp table (to see whats inside for debug)
--select * from @lichenTable
-- BEGIN AND wrapper block for 'LIKE IN' if bit is set
IF @leadingAnd = 1
SET @result = ' AND ('
ELSE
SET @result = ' ('
-- loop through temp table to build multiple "LIKE 'x' OR" blocks inside the outer AND wrapper block
WHILE ((@loopCount IS NOT NULL) AND (@loopCount <= @lineCount))
BEGIN -- begin loop through @lichenTable
IF (@loopcount = 1) -- the first loop does not get the OR in front
SELECT @result = CONCAT(@result, ' ', @colIdentifier, ' LIKE ''', line, '''') FROM @lichenTable WHERE id = @loopCount
ELSE -- but all subsequent loops do
SELECT @result = CONCAT(@result, ' OR ', @colIdentifier, ' LIKE ''', line, '''') FROM @lichenTable WHERE id = @loopCount
SET @loopcount = @loopCount + 1 -- increment loop
END -- end loop through @lichenTable
-- set final parens after lichenTable loop
SET @result = CONCAT(@result, ' )')
END -- end 'like in' branch having found a delimiter
ELSE -- no delimiter was provided
BEGIN -- begin "no delimiter found" branch
IF @leadingAnd = 1
SET @result = CONCAT(' AND ', @colIdentifier, ' LIKE ''' + @argString + '''')
ELSE
SET @result = CONCAT(' ', @colIdentifier, ' LIKE ''' + @argString + '''')
END -- end "no delimiter found" branch
-- Return the result of the function
RETURN @result
END -- end lichen function
GO
ডিলিমিটার সনাক্তকরণ সম্ভবত পরিকল্পনা করা হয়েছে, তবে আপাতত এটি সেমিকোলনের ডিফল্ট হয় যাতে আপনি কেবল default
সেখানে প্রবেশ করতে পারেন । এতে সম্ভবত বাগ রয়েছে। দ্য@leadingAnd
পরামিতি নির্ধারণ করতে যদি আপনি ব্লক সামনে একটি নেতৃস্থানীয় "এবং" করা চান তাই এটি অন্যান্য WHERE বাক্যাংশ সংযোজন সঙ্গে চমত্কারভাবে মধ্যে ফিট করে শুধুমাত্র একটি বিট মান।
ব্যবহারের উদাহরণ (আর্গস্ট্রিংয়ের ডিলিমিটার সহ)
SELECT [dbo].[Lichen] (
default -- @leadingAND, bit, default: 1
,default -- @delimiter, nchar(1), default: ';'
,'foo.bar' -- @colIdentifier, nvarchar(64), this is the column identifier
,'01%;02%;%03%' -- @argString, nvarchar(256), this is the input string to parse "LIKE IN" from
)
GO
এমন একটি এনভারচর (512) ফিরিয়ে দেবে:
AND ( foo.bar LIKE '01%' OR foo.bar LIKE '02%' OR foo.bar LIKE '%03%' )
যদি ইনপুটটিতে ডিলিমিটার না থাকে তবে এটি ব্লকটি এড়িয়ে যাবে:
ব্যবহারের উদাহরণ (আর্গস্ট্রিংয়ের সীমানা ছাড়াই)
SELECT [dbo].[Lichen] (
default -- @leadingAND, bit, default: 1
,default -- @delimiter, nchar(1), default: ';'
,'foo.bar' -- @colIdentifier, nvarchar(64), this is the column identifier
,'01%' -- @argString, nvarchar(256), this is the input string to parse "LIKE IN" from
)
GO
এমন একটি এনভারচর (512) ফিরিয়ে দেবে:
AND foo.bar LIKE '01%'
আমি এ নিয়ে কাজ চালিয়ে যাচ্ছি, সুতরাং আমি যদি কিছু উপেক্ষা করেছি (সুস্পষ্টভাবে স্পষ্টভাবে বা অন্যথায়) দয়া করে বিনা দ্বিধায় মন্তব্য করতে বা পৌঁছে যেতে পারেন।