将 T-SQL 表值函数字符串拆分为 C#
Posted
技术标签:
【中文标题】将 T-SQL 表值函数字符串拆分为 C#【英文标题】:Convert T-SQL table-valued function string split into C# 【发布时间】:2019-06-05 15:49:04 【问题描述】:我正在尝试将 T-SQL 表值函数转换为 c# 代码。此函数通过分隔符拆分字符串。输入样本 E,U7619
有没有办法将逻辑转换成c#代码?
我已经尝试了几件事,但在这里发帖太可悲了。任何帮助将不胜感激。
ALTER FUNCTION [dbo].[SplitText]
(@text VARCHAR(8000),
@delimiter CHAR(1))
RETURNS @words TABLE (objectid SMALLINT PRIMARY KEY, string VARCHAR(1000), optionalid INT)
AS
BEGIN
DECLARE @pos smallint,
@i smallint,
@j smallint,
@s varchar(255),
@o int
SET @pos = 1
WHILE @pos <= LEN(@text)
BEGIN
SET @i = CHARINDEX(' ', @text, @pos)
SET @j = CHARINDEX(@delimiter, @text, @pos)
IF @i > 0 OR @j > 0
BEGIN
IF @i = 0 OR (@j > 0 AND @j < @i)
SET @i = @j
IF @i > @pos
BEGIN
-- @i now holds the earliest delimiter in the string
SET @s = SUBSTRING(@text, @pos, @i - @pos)
SET @o = 0
IF CHARINDEX('|',@s,0) > 0
BEGIN
SET @o = SUBSTRING(@s,0,CHARINDEX('|',@s,0))
SET @s = SUBSTRING(@s,CHARINDEX('|',@s,0)+1,LEN(@s))
END
IF NOT EXISTS (SELECT 1 FROM @words WHERE [string]=@s)
BEGIN
INSERT INTO @words
VALUES (@pos, @s, @o)
END
END
SET @pos = @i + 1
WHILE @pos < LEN(@text) AND SUBSTRING(@text, @pos, 1) IN (' ', ',')
SET @pos = @pos + 1
END
ELSE
BEGIN
SET @s = SUBSTRING(@text, @pos, LEN(@text) - @pos + 1)
IF CHARINDEX('|',@s,0) > 0
BEGIN
SET @o = SUBSTRING(@s,0,CHARINDEX('|',@s,0))
SET @s = SUBSTRING(@s,CHARINDEX('|',@s,0)+1,LEN(@s))
END
IF NOT EXISTS (SELECT 1 FROM @words WHERE [string]=@s)
BEGIN
INSERT INTO @words
VALUES (@pos, @s ,@o)
END
SET @pos = LEN(@text) + 1
END
END
RETURN
END
【问题讨论】:
C# 已经有一个string.Split
函数。您在 SQL 中有如此讨厌的代码的原因是因为它没有。
@DStanley 咳嗽 string_split
咳嗽
在 t-sql 中有更好的分割字符串的方法,但无论你如何分割,c# 都会更快。 Jeff Moden 有一个闪电般的快速分离器here。其他一些选项可以找到here
...如果您有 C# 中的数据要启动,stop splitting anywhere near the database at all。
这读起来非常复杂,但毫无疑问,如果您发布它正在拆分的数据以及它试图从每个字符串中得到什么的示例,它将变得非常简单和明显。你能分享一下吗?然后问题不是对 SQL 进行逆向工程,而是“我们如何从这个 string
中获取我们想要的值?”
【参考方案1】:
看起来您只是在管道上拆分数据。试试这个:
var testdata = "test|example|splitting|words";
var foo = testdata.Split(new string[] "|" , StringSplitOptions.None);
【讨论】:
不是。它根据@delimiter 的任何内容拆分数据。管道也在图片中的某个地方。基于此,不清楚该 SQL 做了什么,但绝对不只是基于一个分隔符进行拆分。以上是关于将 T-SQL 表值函数字符串拆分为 C#的主要内容,如果未能解决你的问题,请参考以下文章
等效于 Amazon Redshift 中的 T-SQL 表值构造函数?
sql 表值函数-将一个传入的字符串用2中分隔符拆分成临时表
T-SQL:与字符串连接相反-如何将字符串拆分为多个记录[重复]