我有一个列MyColumn
,其值为“Value1,Value2”(使用for xml
生成的串联字符串)。我还有一个表值参数@MyTVP
,它可能包含值为“Value2”(或多个值)的行。 SQL的功能类似于:
where MyColumn in (select col from @MyTVP)
我正在考虑编写一个用户定义的函数,其调用类似于:
where MyFunction(MyColumn, @MyTVP)
并且该函数会将MyColumn拆分为单独的值(例如C#的arr.Split(',')
)并查看这些值是否在@MyTVP
中。
首先,这是一个合理的解决方案,还是应该走另一条路?
其次,是否有一种有效的方法可以查看MyColumn
中的多个值是否为IN @MyTVP
?
答案 0 :(得分:1)
你正在玩火:)嗯,这是火柴盒: STRING_SPLIT()
CREATE TABLE #T (ID INT , Value VARCHAR(100))
INSERT INTO #T VALUES (1 , '1,2,3') , (2 , '4,5,6') , (3 , '7,8,9')
SELECT t1.ID, t2.value
FROM #T AS t1
CROSS APPLY STRING_SPLIT(Value, ',') AS t2
ID value
---------
1 1
1 2
1 3
2 4
2 5
2 6
3 7
3 8
3 9
答案 1 :(得分:0)
示例数据
CREATE TABLE #T (ID INT , Value VARCHAR(100))
INSERT INTO #T VALUES (1 , '1,2,3') , (2 , '4,5,6') , (3 , '7,8,9')
<强>查询强>
SELECT DISTINCT ID , Value
FROM (
SELECT ID
, Value
, Split.a.value('.', 'VARCHAR(100)') SplitedValues
FROM
(
SELECT ID
,Value
,Cast ('<X>' + Replace(Value, ',', '</X><X>') + '</X>' AS XML) AS Data
FROM #T
) AS t
CROSS APPLY Data.nodes ('/X') AS Split(a)
)x
WHERE x.SplitedValues IN (1 ,9) -- Replace these hardcoded values with your tvp