现有一个字符串str如下:
["A":12,"B":3,"C":1,"D":40]
怎样用一个函数把str的内容分解并依次赋值到下面的4个变量中
@p_A, @p_B, @p_C, @p_D   int; 
求精简的,谢谢!

解决方案 »

  1.   

    DECLARE @str NVARCHAR(1000)
    SET @str = '["A":12,"B":3,"C":1,"D":40]'DECLARE @p_A int, @p_B INT, @p_C int, @p_D  int; SELECT
    @p_A = A,
    @p_B = B,
    @p_C = C,
    @p_D = D
    FROM
    (
    SELECT 
    fieldname = LEFT(b.NAME, CHARINDEX(':',b.name)-1),
    fieldvalue = RIGHT(b.NAME,LEN(b.name)-CHARINDEX(':',b.name))
    FROM
    (SELECT [name]=CONVERT(XML, '<root><v>'+replace(REPLACE(REPLACE(REPLACE(@str, '"',''), '[', ''),']',''),',','</v><v>')+'</v></root>')) a
    OUTER APPLY
    (SELECT [name] = C.v.value('.','NVARCHAR(MAX)') FROM a.[name].nodes('/root/v') C(v)) b
    ) m
    PIVOT
    (MAX(fieldvalue) FOR fieldname IN([A],[B],[c],[d])) nSELECT @p_A,@p_b,@p_c,@p_d
    /*
    (无列名) (无列名) (无列名) (无列名)
    12 3 1 40
    */
      

  2.   

    --你这明显是JSON格式,为什么不放在前台?
    --或者用循环的方式来截取字段值,并分别赋给变量。
    --SQL SERVER处理字符串的能力还是比较弱的。
      

  3.   


    如果str的格式是这样的话呢?
    字符串str如下:
     ["Aasd":12,"Bifg":3,"Csd":1,"Ddd":40]再难一点,包含若干子串,字符串str如下:
     {["Aasd":12,"Bifg":3,"Csd":1,"Ddd":40],["Aasd":16,"Bifg":5,"Csd":0,"Ddd":49]}
      

  4.   

    --仅供参考
    DECLARE @str NVARCHAR(1000)
    SET @str = '{["Aasd":12,"Bifg":3,"Csd":1,"Ddd":40],["Aasd":16,"Bifg":5,"Csd":0,"Ddd":49]}'
    SET @str = REPLACE(SUBSTRING(@str,3,LEN(@str)-4), '"','')SELECT
    rowid,
        fieldname = LEFT(c.NAME, CHARINDEX(':',c.name)-1),
        fieldvalue = RIGHT(c.NAME,LEN(c.name)-CHARINDEX(':',c.name))
    FROM
    (
    SELECT rowid = ROW_NUMBER() OVER(ORDER BY GETDATE()), name=CONVERT(XML, '<root><v>'+replace(b.name,',','</v><v>')+'</v></root>') FROM
    (SELECT [name]=CONVERT(XML, '<root><v>'+replace(@str,'],[','</v><v>')+'</v></root>')) a
    OUTER APPLY
    (SELECT [name] = C.v.value('.','NVARCHAR(MAX)') FROM a.[name].nodes('/root/v') C(v)) b
    ) t
    CROSS APPLY
    (
    SELECT [name] = C.v.value('.','NVARCHAR(MAX)') FROM t.[name].nodes('/root/v') C(v)
    ) c/*
    rowid fieldname fieldvalue
    1 Aasd 12
    1 Bifg 3
    1 Csd 1
    1 Ddd 40
    2 Aasd 16
    2 Bifg 5
    2 Csd 0
    2 Ddd 49
    */