Tsql 将字符串的内容作为记录集返回
我正试图从一个数据库中提取数据 本质上,列表控件允许您在web表单(构建在WordPress网站上)上收集多列表数据。但是,用户提供的表和记录都被放入一行文本中,用于表单的记录提交 我已成功编写了一个自定义标量函数,以获取原始输入文本,如下所示:Tsql 将字符串的内容作为记录集返回,tsql,ssms,gravity-forms-plugin,ssms-2012,Tsql,Ssms,Gravity Forms Plugin,Ssms 2012,我正试图从一个数据库中提取数据 本质上,列表控件允许您在web表单(构建在WordPress网站上)上收集多列表数据。但是,用户提供的表和记录都被放入一行文本中,用于表单的记录提交 我已成功编写了一个自定义标量函数,以获取原始输入文本,如下所示: | ID | TidyString | |--------|-------------------------------| | 1 | ItemID: 1 Name: Dennis Dish..
| ID | TidyString |
|--------|-------------------------------|
| 1 | ItemID: 1 Name: Dennis Dish...|
a:3:{i:0;a:3:{s:6:“ItemID”;s:1:“1”;s:4:“Name”;s:10:“Dennis Dish”;s:12:“Phone Number”;s:12:“01225123456”}i:1;a:3:{s:6:“ItemID”;s:1:“2”;s:4:“Name”;s:13:“Sally Spatula”;s:12:“Phone Number”;s:12:“01225654321”}i:2;a:3:{s:6:“ItemID”;s:1:“s:3;s:4:“Name”;Terry:12:“Phone:7856}
…并按如下方式返回它(仍然作为单个文本字符串):
这是相当直接和有用的,但我现在需要编写一些东西,可以将原始字符串返回到一组记录
例如,如果我有一个包含以下数据的表:
| ID | RawString |
|--------|-------------------------------|
| 1 | a:3:{i:0;a:3:{s:6:"ItemID"... |
..而不是将其作为更整洁的字符串返回,如下所示:
| ID | TidyString |
|--------|-------------------------------|
| 1 | ItemID: 1 Name: Dennis Dish...|
..我正在寻找返回以下内容的方法:
| ID | ItemID | Name | Phone Number |
|--------|--------|---------------|--------------|
| 1 | 1 | Dennis Dish | 01225 123456 |
| 1 | 2 | Sally Spatula | 01225 654321 |
| 1 | 3 | Terry Tins | 01225 789456 |
在标量函数中,我能够识别原始字符串格式中有助于整理的部分:
a:n:{…
(一开始)表示有多少条记录,因此a:3:{…
表示
有3条记录
i:n;..
表示记录编号,因此i:0;..
表示第一个
记录
a:n:{…
(在记录中)表示
记录中的列/值对,因此a:3:{
表示有3对
此记录中列/值的数目
s:…
表示以下列或值中的字符数,因此s:2…
表示列或值的长度为2个字符
通过缩进原始字符串,可以更容易地将其可视化:
a:3:{
i:0;
a:3:{
s:2:"ItemID";
s:1:"1";
s:4:"Name";
s:10:"Dennis Dish";
s:12:"Phone Number";
s:12:"01225 123456";
}
i:1;
a:3:{
s:2:"ItemID";
s:1:"2";
s:4:"Name";
s:13:"Sally Spatula";
s:12:"Phone Number";
s:12:"01225 654321";
}
i:2;
a:3:{
s:2:"ItemID";
s:1:"3";
s:4:"Name";
s:10:"Terry Tins";
s:12:"Phone Number";
s:12:"01225 789456";
}
}
我真的不确定从哪里开始,以结果集的形式从这个原始字符串返回数据
如果有任何提示,我们将不胜感激。这是您的工作。如果您下载了该函数的副本,您可以执行以下操作:
DECLARE @yourstring varchar(1000) =
'a:3:{
i:0;
a:3:{
s:2:"ItemID";
s:1:"1";
s:4:"Name";
s:10:"Dennis Dish";
s:12:"Phone Number";
s:12:"01225 123456";
}
i:1;
a:3:{
s:2:"ItemID";
s:1:"2";
s:4:"Name";
s:13:"Sally Spatula";
s:12:"Phone Number";
s:12:"01225 654321";
}
i:2;
a:3:{
s:2:"ItemID";
s:1:"3";
s:4:"Name";
s:10:"Terry Tins";
s:12:"Phone Number";
s:12:"01225 789456";
}
}';
WITH
names(itemID, ps) AS -- extract the names
(
SELECT
ROW_NUMBER() OVER (ORDER BY position),
SUBSTRING
(
@yourstring,
position+7,
CHARINDEX(';', @yourstring, position+7)-(position+8)
)
FROM dbo.NGrams8k(@yourstring, 7)
WHERE token = '"Name";'
),
phoneNbrs(itemID, ps) AS -- extract the phone numbers
(
SELECT
ROW_NUMBER() OVER (ORDER BY position),
SUBSTRING
(
@yourstring,
position+15,
CHARINDEX(';', @yourstring, position+15)-(position+16)
)
FROM dbo.NGrams8k(@yourstring, 15)
WHERE token = '"Phone Number";'
)
SELECT
id = 1,
n.itemID,
[Name] = SUBSTRING(n.ps, CHARINDEX('"', n.ps)+1, 100),
[Phone Number] = SUBSTRING(p.ps, CHARINDEX('"', p.ps)+1, 30)
FROM names n
JOIN phoneNbrs p ON n.itemID = p.itemID;
结果:
| ID | ItemID | Name | Phone Number |
|--------|--------|---------------|--------------|
| 1 | 1 | Dennis Dish | 01225 123456 |
| 1 | 2 | Sally Spatula | 01225 654321 |
| 1 | 3 | Terry Tins | 01225 789456 |
谢谢你的文章,Alan-这将花费我一段时间来完全消化和理解如何让NGrams8K函数返回我需要的内容,但它看起来确实很有趣。抱歉-最初没有注意到你在第一个代码块中的其余部分。非常感谢-这似乎很有效。现在将调整它,以便它可以读取@y我们的字符串
来自表列,而不是声明的变量。快速问题-上面使用的位置
是什么?我以前没有将其作为关键字使用,也找不到任何有关它的信息。我很高兴这对您有用。该位置表示字符在字符串中的位置。为了更好地理解我的意思,您可以运行这些查询:从dbo.NGrams8k('abc123',1'中选择*;从dbo.NGrams8k('abc123',2'中选择*;从dbo.NGrams8k('abc123',3'中选择*);