2016-10-18 6 views
2

벽에 머리를 부딪 히고 있습니다. 분명히 알 수있는 부분이 있지만, 인터넷 검색으로 인해 필요한 정보가 없거나 필요한 정보를 얻을 수 없습니다. 희망 여기에 천재가 나를 도울 수 :SQL Server 2016 기존 열의 JSON

나는 조금 같이 보입니다 테이블이 다음 JSON 내 SQL Server 테이블에 이미, 기본적으로 바구니의 제품 내용입니다

enter image description here 합니다. 현재 행은 전체 구매 트랜잭션이며, JSON은 각 제품의 다른 하위 집합과 다양한 속성입니다.

다음은 예제로 JSON 문자열의 2 행은 다음과 같습니다

[{"id":"429ac4e546-11e6-471e","product_id":"dc85bff3ecb24","register_id":"0adaaf5c4a65e37c7","sequence":"0","handle":"Skirts","sku":"20052","name":"Skirts","quantity":1,"price":5,"cost":0,"price_set":1,"discount":-5,"loyalty_value":0.2,"tax":0,"tax_id":"dc85058a-a69e-11e58394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":5,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]}] 

[{"id":"09237884-9713-9b6751fe0b85ffd","product_id":"dc85058a-a66b4c06702e13","register_id":"06bf5b9-31e2b4ac9d0a","sequence":"0","handle":"BricaBrac","sku":"20076","name":"Bric a Brac","quantity":1,"price":7,"cost":0,"price_set":1,"discount":-7,"loyalty_value":0.28,"tax":0,"tax_id":"dc85058a-2-54f20388394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":7,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]},{"id":"09237884-9713-9b6","product_id":"dc85058a-a6fe112-6b4bfafb107e","register_id":"06bf537bf6b9-31e2b4ac9d0a","sequence":"1","handle":"LadiesTops","sku":"20040","name":"Ladies Tops","quantity":1,"price":10,"cost":0,"price_set":1,"discount":-10,"loyalty_value":0.4,"tax":0,"tax_id":"dc85058a-a690388394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":10,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]},{"id":"09237884-9713-9b52007fa6c7d","product_id":"dc85058a-a6fa-b4c06d7ed5a","register_id":"06bf537b-cf6b9-31e2b4ac9d0a","sequence":"2","handle":"DVD","sku":"20077","name":"DVD","quantity":1,"price":3,"cost":0,"price_set":1,"discount":-3,"loyalty_value":0.12,"tax":0,"tax_id":"dc85058a-e5-e112-54f20388394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":3,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]}] 

그래서 내가 무엇을 달성하려고하는 것은 그 열에있는 데이터에서 새 테이블을 만드는 것입니다 . (ID 필드에서 고유 한 문자열을 통해 제품 테이블을이 첫 번째 테이블에 연결할 수 있습니다.)

sql2016에있는 새로운 기본 JSON을 사용하여이 작업을 수행 할 수 있습니까?

내 대안은 SSIS를 통해 플러그인으로 수행하는 것이지만 SQL Server 내부의 저장 프로 시저로 수행 할 수 있다면 더 깨끗합니다.

미리 감사드립니다.

+0

당신이 예상 출력 –

답변

0

가 감사 whic h는 다음과 같습니다.

SELECT a.ID, b.* -- select ID from original table for proofing, and all from table b 
FROM reporttest a -- table name with alias 
CROSS apply Openjson([register_sale_products]) -- column name 
    WITH (
    id nvarchar(200) '$.id', 
    product_id nvarchar(200) '$.product_id', 
    register_id nvarchar(200) '$.register_id', 
    sequence nvarchar(200) '$.sequence', 
    handle nvarchar(200) '$.handle', 
    sku nvarchar(200) '$.sku', 
    name nvarchar(200) '$.name', 
    quantity nvarchar(200) '$.quantity', 
    price nvarchar(200) '$.price', 
    cost nvarchar(200) '$.cost', 
    price_set nvarchar(200) '$.price_set', 
    discount nvarchar(200) '$.discount', 
    loyalty_value nvarchar(200) '$.loyalty_value', 
    tax nvarchar(200) '$.tax', 
    tax_id nvarchar(200) '$.tax_id', 
    tax_name nvarchar(200) '$.tax_name', 
    --No Tax nvarchar(200) '$.No Tax', 
    tax_rate nvarchar(200) '$.tax_rate', 
    tax_total nvarchar(200) '$.tax_total', 
    price_total nvarchar(200) '$.price_total', 
    display_retail_price_tax_inclusive nvarchar(200) '$.display_retail_price_tax_inclusive', 
    status nvarchar(200) '$.status', 
    CONFIRMED nvarchar(200) '$.CONFIRMED', 
    attributes nvarchar(200) '$.attributes', 
    name nvarchar(200) '$.name', 
    line_note nvarchar(200) '$.line_note', 
    value nvarchar(200) '$.value'  
     ) b -- alias the "with" section as table b 
1

여기에서 ID를 추출하는 OPENJSON를 사용하여 하나의 방법입니다 귀하의 JSON

SELECT id 
FROM Yourtable 
CROSS apply Openjson([register_sale_products]) 
WITH (id varchar(500) 'lax $.id') 

두 개의 경로

  • 느슨한 OPENJSON

    1. 스트릭의 모드

    Strict이 있습니다 : 윌 propertypath

    lax을 찾을 수없는 리터 던져 오류 : propertypath에 발견하지 때이 NULL를 반환합니다.당신이 어떤 모드를 언급하지 않은 경우 다음 Lax은 기본적으로 사용됩니다

    당신은 당신의 필요 조건에 따라 위의 모드를 사용할 수 있습니다

    DEMO :

    스키마 설정

    CREATE TABLE json_test 
        (
        json_col VARCHAR(8000) 
    ) 
    

    샘플 데이터

    INSERT INTO json_test 
    VALUES  ('[{"id":"429ac4e546-11e6-471e","product_id":"dc85bff3ecb24","register_id":"0adaaf5c4a65e37c7","sequence":"0","handle":"Skirts","sku":"20052","name":"Skirts","quantity":1,"price":5,"cost":0,"price_set":1,"discount":-5,"loyalty_value":0.2,"tax":0,"tax_id":"dc85058a-a69e-11e58394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":5,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]}]'), 
          ('[{"id":"09237884-9713-9b6751fe0b85ffd","product_id":"dc85058a-a66b4c06702e13","register_id":"06bf5b9-31e2b4ac9d0a","sequence":"0","handle":"BricaBrac","sku":"20076","name":"Bric a Brac","quantity":1,"price":7,"cost":0,"price_set":1,"discount":-7,"loyalty_value":0.28,"tax":0,"tax_id":"dc85058a-2-54f20388394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":7,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]},{"id":"09237884-9713-9b6","product_id":"dc85058a-a6fe112-6b4bfafb107e","register_id":"06bf537bf6b9-31e2b4ac9d0a","sequence":"1","handle":"LadiesTops","sku":"20040","name":"Ladies Tops","quantity":1,"price":10,"cost":0,"price_set":1,"discount":-10,"loyalty_value":0.4,"tax":0,"tax_id":"dc85058a-a690388394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":10,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]},{"id":"09237884-9713-9b52007fa6c7d","product_id":"dc85058a-a6fa-b4c06d7ed5a","register_id":"06bf537b-cf6b9-31e2b4ac9d0a","sequence":"2","handle":"DVD","sku":"20077","name":"DVD","quantity":1,"price":3,"cost":0,"price_set":1,"discount":-3,"loyalty_value":0.12,"tax":0,"tax_id":"dc85058a-e5-e112-54f20388394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":3,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]}]') 
    

    쿼리

    SELECT id 
    FROM json_test 
    CROSS apply Openjson(json_col) 
         WITH (id varchar(500) 'lax $.id') 
    

    결과 : 대답에 저를 안내 Prdp의 반응에

    ╔═══════════════════════════════╗ 
    ║    id    ║ 
    ╠═══════════════════════════════╣ 
    ║ 429ac4e546-11e6-471e   ║ 
    ║ 09237884-9713-9b6751fe0b85ffd ║ 
    ║ 09237884-9713-9b6║ 
    ║ 09237884-9713-9b52007fa6c7d ║ 
    ║ 429ac4e546-11e6-471e   ║ 
    ║ 09237884-9713-9b6751fe0b85ffd ║ 
    ║ 09237884-9713-9b6║ 
    ║ 09237884-9713-9b52007fa6c7d ║ 
    ╚═══════════════════════════════╝ 
    
  • +0

    감사를 추가 할 수 있습니다! 정말 감사합니다. 그것은 저를 거기가는 길의 일부로 만듭니다. 그러나 JSON 문자열의 모든 부분을 ID 열뿐만 아니라 테이블로 반환하려고합니다. 그게 가능하니? – Maz

    +0

    당신이 내게 준 것은 솔루션을 만드는 데 충분하다고 생각합니다! 지금 작업중인데 작동하면 다시 게시 할 것입니다 .. – Maz

    +0

    그래, 네가 해결해 주신 덕분에 해결책이 생겼다. 다른 사람들을 도울 답변으로 게시합니다. – Maz

    0

    간단한 SQL 쿼리로 약간의 노력 만하면됩니다.

    메이크업이 저장 프로 시저 등의 쿼리 필요할 때 호출 ..

    편집 귀하의 요구 사항에 따라이 쿼리.

    변경 '% ID가 ""' '%의 anything_inside_the_string'에 당신이 값을 얻을 것이다 .. :)

    DECLARE @LOOP_1 INT=1,@NAME NVARCHAR (MAX),@LEFT NVARCHAR(MAX),@loop_2 int=0 
    SET @NAME='[{"id":"429ac4e546-11e6-471e","product_id":"dc85bff3ecb24","register_id":"0adaaf5c4a65e37c7","sequence":"0","handle":"Skirts","sku":"20052","name":"Skirts","quantity":1,"price":5,"cost":0,"price_set":1,"discount":-5,"loyalty_value":0.2,"tax":0,"tax_id":"dc85058a-a69e-11e58394d","tax_name":"No Tax","tax_rate":0,"tax_total":0,"price_total":5,"display_retail_price_tax_inclusive":"1","status":"CONFIRMED","attributes":[{"name":"line_note","value":""}]}]' 
    
    -- First loop started to find where 'id":"' is located 
    WHILE @LOOP_1!=(SELECT LEN(@NAME)) 
    BEGIN 
        SET @LEFT=(LEFT(@NAME,@LOOP_1)) 
        IF @LEFT LIKE '%id":"' -------- Change '%id":"' to '%product_id":"' and you will get the value.. :) 
        BEGIN 
    
         set @NAME=(right(@NAME,len(@name)[email protected]_1)) 
    
         -- Second loop started to find where ',' is located after '"id":"' 
         WHILE @loop_2!=(SELECT LEN(@NAME)) 
         BEGIN 
    
          SET @LEFT=(LEFT(@NAME,@loop_2)) 
          IF @LEFT LIKE '%,' 
          BEGIN 
           if left(@name,@loop_2-1)like '%"%' 
           SELECT left(@name,@loop_2-2) 
           else 
           SELECT left(@name,@loop_2-2) 
           set @loop_2=(SELECT LEN(@NAME)-1) 
           set @[email protected]_2 
    
          END 
         SET @[email protected]_2+1 
         END 
    
        END 
        SET @[email protected]_1+1 
    END 
    
    +0

    네이티브 지원이있는 경우 왜 이것을 할 수 있습니까? –

    +0

    @prdp Maz 요구 사항에 따라 작업을 수행하려고했습니다. 그는 네이티브 JSON보다는 sp에서 솔루션을 사용해 볼 의사가있었습니다. –