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

时间:2017-05-02 15:33:10

标签: tsql ssms gravity-forms-plugin ssms-2012

我正在尝试从Gravity Form list control中提取数据。

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

我设法编写了一个自定义标量函数来获取原始输入文本,如下所示:

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:"01225 123456";}i:1;a:3:{s:6:"ItemID";s:1:"2";s:4:"Name";s:13:"Sally Spatula";s:12:"Phone Number";s:12:"01225 654321";}i:2;a:3:{s:6:"ItemID";s:1:"3";s:4:"Name";s:10:"Terry Tins";s:12:"Phone Number";s:12:"01225 789456";}}

...并像这样返回它(仍然是单个文本字符串):

ItemID: 1
Name: Dennis Dish
Phone Number: 01225 123456

ItemID: 2
Name: Sally Spatula
Phone Number: 01225 654321

ItemID: 3
Name: Terry Tins
Phone Number: 01225 789456

这是相当直接且有用的,但我现在需要写一些可以将原始字符串返回到一组记录的内容。

因此,例如,如果我有一个包含以下数据的表:

|   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";
                }
    }

我不确定从这个原始字符串中将数据作为结果集返回的方式开始。

任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这是NGrams8K的工作。如果您下载该功能的副本,您可以这样做:

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 |