简体   繁体   中英

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

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.

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 '%0e+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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM