我正在尝试在 SQL Server 中创建一个存储过程,该过程将从 C# 实体框架中使用。
我的主要重点是输入长字符串文本,然后按字符拆分该数据并返回匹配数据的值列表。
详细:
-
是数据类型名称与其值之间的分隔符:
是 Type 和 ASIN 之间的分隔符 ,
是两个不同值之间的分隔符 我想通过过滤的数据列表ASIN
,并Type
从这个存储过程。我在@DataString
变量中获取了完整的文本字符串,但我不知道如何拆分文本并运行SELECT
以返回所有数据。
有什么想法要做吗?提出您可能有的任何问题。
长文本字符串示例:
Type-1:ASIN-NsQf8,ASIN-YhQfu,ASIN-dpQf9,ASIN-rsWf3
未完成的SQL代码:
CREATE PROCEDURE dbo.lk_GetMatchingDataOfThirdparty
@DataString VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM ThirdPartyData
WHERE ASIN = '@value_get_from_string'
AND Type = '@value_get_from_string'
END
使用拆分函数:
CREATE FUNCTION [dbo].[split](
@delimited NVARCHAR(MAX),
@delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
INSERT INTO @t(val)
SELECT r.value('.','nvarchar(MAX)') as item
FROM @xml.nodes('/t') as records(r)
RETURN
END
GO
DECLARE @DataString VARCHAR(MAX);
SET @DataString ='Type-1:ASIN-NsQf8,ASIN-YhQfu,ASIN-dpQf9,ASIN-rsWf3'
;WITH cte as (
SELECT a.id as [1], b.id as [2], c.id as [3], c.val
FROM (
SELECT * FROM dbo.split(@DataString, ':')
) a
CROSS APPLY dbo.split(a.val,',') b
CROSS APPLY dbo.split(b.val,'-') c
),
typecte as (
select b.val as [TypeValue]
from cte a
inner join cte b
ON a.[1] = b.[1]
AND a.[2] = b.[2]
AND a.[3]+1 = b.[3] -- Next value
WHERE a.val='Type'
),
asincte as (
select b.val as [ASINValue]
from cte a
inner join cte b
ON a.[1] = b.[1]
AND a.[2] = b.[2]
AND a.[3]+1 = b.[3] -- Next value
WHERE a.val='ASIN'
)
SELECT *
FROM ThirdPartyData
WHERE [ASIN] IN (SELECT [ASINValue] FROM asincte)
AND [Type] IN (SELECT [TypeValue] FROM typecte)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句