Tsql 将字符串的内容作为记录集返回

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..

我正试图从一个数据库中提取数据

本质上,列表控件允许您在web表单(构建在WordPress网站上)上收集多列表数据。但是,用户提供的表和记录都被放入一行文本中,用于表单的记录提交

我已成功编写了一个自定义标量函数,以获取原始输入文本,如下所示:

|   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'中选择*);