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

时间:2009-12-04 16:14:48

标签: sql sql-server sql-server-2005 tsql refactoring

最大的问题是,是否有“内置”SQL Server 2005函数将字符串参数序列化/反序列化为表变量?其余部分进一步解释了我的需求,但可能没有必要。< / p>

我有一个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”之类的东西上做一个双重dbo.split()。但是,我想要一些更人性化和标准化的东西,也许是XML?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

使用自定义表格表达式(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)