Home > Mobile >  concatenate all columns from with names of columns also in it, one string for every row
concatenate all columns from with names of columns also in it, one string for every row

Time:11-12

CREATE TABLE myTable 
(
    COL1 int, 
    COL2 varchar(10), 
    COL3 float
)

INSERT INTO myTable
VALUES (1, 'c2r1', NULL), (2, 'c2r2', 2.335)

I want an output with for every row of a table one string with all columns and the names in it.

Something like:

COL1=1|COL2=c2r1|COL3=NULL
COL1=2|COL2=c2r2|COL3=2.3335

I have a table with lot of columns so it has to be dynamic (it would use it on different tables also), is there an easy solution where I can do it and choose separator and things like that... (It has to deal with NULL-values & numeric values also.)

I am using SQL Server 2019.

CodePudding user response:

Since you are on 2019, string_agg() with a bit if JSON

Example

 Select NewVal
  From  MyTable A
  Cross Apply ( Select NewVal = string_agg([key] '=' isnull(value,'null'),'|')
                 From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES  )) 
             ) B

Results

NewVal
COL1=1|COL2=c2r1|COL3=null
COL1=2|COL2=c2r2|COL3=2.335000000000000e 000   -- Don't like the float

EDIT to Trap FLOATs

Select NewVal
  From  MyTable A
  Cross Apply ( Select NewVal = string_agg([key] '=' isnull(case when value like ' 0%' then concat('',convert(decimal(15,3),convert(float,value))) else value end,'null'),'|')
                 From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES  )) 
             ) B

Results

NewVal
COL1=1|COL2=c2r1|COL3=null
COL1=2|COL2=c2r2|COL3=2.335

CodePudding user response:

Would one dare to abuse json for this?

SELECT REPLACE (REPLACE (REPLACE (REPLACE (REPLACE (ca.js,'":','='), ',"','|'), '"',''), '[{','') ,'}]','') AS data
FROM (SELECT col1 as id FROM myTable) AS list
CROSS APPLY
(
  SELECT t.col1
  , t.col2
  , cast(t.col3 as decimal(16,3)) as col3
  FROM myTable t
  WHERE t.col1 = list.id
  FOR JSON AUTO, INCLUDE_NULL_VALUES
) ca(js)

It'll work with a simple SELECT t.* in the cross apply. But the floats tend to be bit too long then.

  • Related