ฉันรู้ว่ามันสายมาก แต่ฉันก็มีสถานการณ์ที่คล้ายกัน ฉันต้องการตัวดำเนินการ "Like In" สำหรับชุดของโพรซีเดอร์ที่เก็บไว้ซึ่งยอมรับพารามิเตอร์จำนวนมากและจากนั้นใช้พารามิเตอร์เหล่านั้นเพื่อรวบรวมข้อมูลจากระบบ RDBMS หลายระบบดังนั้นจึงไม่มีเทคนิคเฉพาะของ RDBMS แต่ขั้นตอนการจัดเก็บและฟังก์ชั่นใด ๆ จะทำงานบน MS SQL Server ดังนั้นเราจึงสามารถใช้ T-SQL สำหรับการทำงานของการสร้างคำสั่ง SQL แบบเต็มสำหรับแต่ละ RDBMS แต่ผลลัพธ์นั้นจะต้องเป็นอิสระจาก RDBMS
นี่คือสิ่งที่ฉันเกิดขึ้นในขณะนี้เพื่อเปลี่ยนสตริงที่มีการคั่น (เช่นพารามิเตอร์ที่เข้ามาในกระบวนงานที่เก็บไว้) เป็นบล็อกของ SQL ฉันเรียกมันว่า "ไลเคน" สำหรับ "ไลค์อิน" รับมัน
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
พารามิเตอร์เป็นเพียงค่าบิตเพื่อตรวจสอบว่าคุณต้องการนำ "และ" ใส่ในหน้าของบล็อกจึงเหมาะกับในอย่างกับที่อื่น ๆ ที่เพิ่มเติมข้อ
ตัวอย่างการใช้งาน (พร้อมตัวคั่นใน argString)
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
จะส่งคืน nvarchar (512) ที่มี:
AND ( foo.bar LIKE '01%' OR foo.bar LIKE '02%' OR foo.bar LIKE '%03%' )
นอกจากนี้ยังจะข้ามบล็อกหากอินพุตไม่มีตัวคั่น:
ตัวอย่างการใช้งาน (ไม่มีตัวคั่นใน argString)
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
จะส่งคืน nvarchar (512) ที่มี:
AND foo.bar LIKE '01%'
ฉันจะทำงานนี้ต่อไปดังนั้นหากฉันมองข้ามบางสิ่งบางอย่าง (แจ่มแจ้งชัดเจนหรืออย่างอื่น) โปรดแสดงความคิดเห็นหรือติดต่อ