代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

是否有任何内置的SQL Server 2005函数可以将字符串参数序列化/反序列化到表中?

  •  0
  • Zachary Scott  · 技术社区  · 15 年前

    最大的问题是,是否有任何“内置”的SQL Server 2005函数可以将字符串参数序列化/反序列化为表变量? 其余的解释了我的需要,但可能不是必要的。

    我有一个要重构的SQL SP。它目前接受五个客户ID和五组与这些客户相关的订单ID。(一对多)。

    我想更改参数以选择一个或多个客户ID,每个客户ID都有一个或多个订单ID。

    客户ID列表很容易,因为您可以提供一个字符串“1,3,5,77,21”,然后是dbo.split(@customer,,')(然后是isNumeric()和convert(int)。…)

    翻页会更困难。我的第一个想法是一根类似于“【1,3,5】,【2,4,6】,【2,4,6】”的绳子。当然,我可以在“1,3,5 2,4,6 2,4,6”之类的东西上作弊并执行double dbo.split()。但是,我想要一些更人性化和标准化的东西,也许是XML?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Adriaan Stander    15 年前
        2
  •  1
  •   Darryl Peterson    15 年前

    使用自定义表表达式(CTE),可以更容易地将列表转换为表。 您可以调整此模式以创建正在考虑的嵌套数据。

    DECLARE
        @cust_list  VARCHAR(1000)
    
    SET @cust_list = '111,222,333,444,555'
    
    ;WITH cust_tbl(i,j)
    AS
    (
        SELECT  i = 1,
                j = CHARINDEX (',', @cust_list + ',')
        UNION ALL
        SELECT  i = j + 1,
                j = CHARINDEX (',', @cust_list + ',', j + 1)
          FROM  cust_tbl
         WHERE  CHARINDEX (',', @cust_list + ',', j + 1) <> 0
    )
    SELECT  SUBSTRING(@cust_list, i, j - i) AS CustId
      FROM  cust_tbl
    GO
    
    CustId
    -------
    111
    222
    333
    444
    555
    
    (5 row(s) affected)