2009-12-04 1 views
0

La grande question est de savoir s'il existe des fonctions SQL Server 2005 «intégrées» pour sérialiser/désérialiser les paramètres de chaîne à des variables de table? Le reste explique mon besoin plus loin, mais peut ne pas être nécessaire.Existe-t-il des fonctions SQL Server 2005 intégrées pour sérialiser/désérialiser les paramètres de chaîne dans une table?

J'ai un SP SQL que je voudrais refactoriser. Il accepte actuellement cinq identifiants de clients et cinq ensembles d'identifiants de commande pertinents pour ces clients. (un à plusieurs)

Je voudrais changer les paramètres pour sélectionner un ou plusieurs identifiants de client ayant chacun un ou plusieurs identifiants de commande.

La liste d'identification du client serait facile car vous pouvez fournir une chaîne "1,3,5,77,21", puis dbo.split (@customer, ',') (puis isnumeric() et convert (int) ..)

Pages serait plus difficile. Ma première pensée est une chaîne comme "[1, 3, 5], [2, 4, 6], [2, 4, 6]". Bien sûr, je pourrais tricher et faire un double dbo.split() sur quelque chose comme "1,3,5 | 2,4,6 | 2,4,6". Cependant, je voudrais quelque chose d'un peu plus humanisé et standard, peut-être XML?

Répondre

1

Utilisation d'expressions de table personnalisée (CTE), vous pouvez convertir la liste à une table beaucoup plus facilement . Vous pouvez peut-être adapter ce modèle pour créer les données imbriquées que vous envisagez.

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) 
Questions connexes