ฉันฉีกขาดระหว่างการแนะนำคุณให้รู้จัก SO หรือตอบคำถามที่นี่ 'เพราะนี่เป็นคำถามการเขียนโปรแกรม แต่เนื่องจากฉันมีวิธีแก้ปัญหาแล้วฉันจึงใช้ ... ฉันจะโพสต์สิ่งนั้น;)
วิธีนี้ใช้งานได้คือคุณป้อนสตริงที่คั่นด้วยจุลภาค (แยกง่ายไม่แยกสไตล์ CSV) ในขั้นตอนการจัดเก็บเป็น varchar (4000) แล้วฟีดรายการที่เป็นฟังก์ชันนี้และได้รับตารางที่มีประโยชน์ออกมา ตารางของ varchars เพียง
สิ่งนี้ช่วยให้คุณสามารถส่งค่าของรหัสที่คุณต้องการประมวลผลและคุณสามารถทำการเข้าร่วมแบบง่าย ๆ ณ จุดนั้น
อีกทางหนึ่งคุณสามารถทำบางสิ่งด้วย CLR DataTable และฟีดข้อมูลนั้น แต่นั่นเป็นค่าใช้จ่ายที่มากกว่าในการสนับสนุนและทุกคนเข้าใจรายการ CSV
USE [Database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[splitListToTable] (@list nvarchar(MAX), @delimiter nchar(1) = N',')
RETURNS @tbl TABLE (value varchar(4000) NOT NULL) AS
/*
http://www.sommarskog.se/arrays-in-sql.html
This guy is apparently THE guy in SQL arrays and lists
Need an easy non-dynamic way to split a list of strings on input for comparisons
Usage like thus:
DECLARE @sqlParam VARCHAR(MAX)
SET @sqlParam = 'a,b,c'
SELECT * FROM (
select 'a' as col1, '1' as col2 UNION
select 'a' as col1, '2' as col2 UNION
select 'b' as col1, '3' as col2 UNION
select 'b' as col1, '4' as col2 UNION
select 'c' as col1, '5' as col2 UNION
select 'c' as col1, '6' as col2 ) x
WHERE EXISTS( SELECT value FROM splitListToTable(@sqlParam,',') WHERE x.col1 = value )
*/
BEGIN
DECLARE @endpos int,
@startpos int,
@textpos int,
@chunklen smallint,
@tmpstr nvarchar(4000),
@leftover nvarchar(4000),
@tmpval nvarchar(4000)
SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@list) / 2
BEGIN
SET @chunklen = 4000 - datalength(@leftover) / 2
SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen)
SET @textpos = @textpos + @chunklen
SET @startpos = 0
SET @endpos = charindex(@delimiter, @tmpstr)
WHILE @endpos > 0
BEGIN
SET @tmpval = ltrim(rtrim(substring(@tmpstr, @startpos + 1,
@endpos - @startpos - 1)))
INSERT @tbl (value) VALUES(@tmpval)
SET @startpos = @endpos
SET @endpos = charindex(@delimiter, @tmpstr, @startpos + 1)
END
SET @leftover = right(@tmpstr, datalength(@tmpstr) / 2 - @startpos)
END
INSERT @tbl(value) VALUES (ltrim(rtrim(@leftover)))
RETURN
END