首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写一个存储过程,该存储过程接受输入字符串并将其拆分为字符。

编写一个存储过程,该存储过程接受输入字符串并将其拆分为字符。
EN

Stack Overflow用户
提问于 2018-08-24 12:15:08
回答 2查看 170关注 0票数 0

我正在尝试在Server中创建一个存储过程,它将从C#实体框架中使用。

我的主要关注点是输入长字符串文本,然后将数据拆分为字符,并返回匹配数据的值列表。

详细情况:

  • -是数据类型名称与其值之间的分隔符。
  • :是介于类型和ASIN之间的分隔器
  • ,是两个不同值之间的分隔符。

我希望从这个存储过程中获得由ASINType过滤的数据列表。我在@DataString变量中获得全文字符串,但我不知道如何拆分文本并运行SELECT来返回所有数据。

有什么办法吗?问你可能有的任何问题。

长文本字符串示例:

代码语言:javascript
复制
Type-1:ASIN-NsQf8,ASIN-YhQfu,ASIN-dpQf9,ASIN-rsWf3

未完成的SQL代码:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-24 13:10:40

使用拆分函数:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2018-08-24 12:44:11

SQL CLR是一种被忽略的编码方法,它与关系数据库无关。字符串操作是SQL能够比SQL脚本处理得更好的一个很好的例子。在上面的示例中,可以做的是调用SQL函数,该函数对长字符串文本执行字符串操作,以返回所需的值,然后将这些变量插入SELECT语句中。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52004273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档