includi solo gli attributi di un record che non sono nulli

sqlbulkcopy sql-server tsql

Domanda

Carissime persone da StackOverflow

Attualmente sto lavorando a un meccanismo per esportare i dati da un database. Ogni record ha circa 30 attributi e voglio solo esportare quegli attributi che hanno un valore reale.

Se la spiegazione non è abbastanza precisa, ecco un esempio:

+----+-----------+------------+---------+--------+
| ID | Name      | Profession | Country | Salary |
+----+-----------+------------+---------+--------+
| 1  | John Doe  | NULL       | USA     | 5000   |
+----+-----------+------------+---------+--------+
| 2  | Jane Doe  | Painter    | NULL    | NULL   |
+----+-----------+------------+---------+--------+
| 3  | Jonas Doe | Butcher    | England | 8000   |
+----+-----------+------------+---------+--------+

Expected outputs:
John Doe: John Doe, USA, 5000
Jane Doe: Jane Doe, Painter
Jonas Doe: Jonas Doe, Butcher, England, 8000

Queste uscite dovrebbero essere generate in un file XML.

Questo dovrebbe essere possibile con ogni record nel database, se possibile. Stavo cercando una funzione che controllasse se un attributo ha un valore e, a seconda di ciò, lo aggiunge al file di esportazione o meno. Purtroppo non ho trovato nulla di simile.

Modifica: Quello che ho fatto fino ad ora è solo scrivere la query per ottenere tutti gli attributi possibili:

CREATE PROCEDURE export @id int AS
BEGIN
SELECT Name,Profession,Country,Salary FROM Employee
WHERE ID = @id;
END
GO

Risposta accettata

Puoi semplicemente selezionare tutto dalla tabella che desideri, usando FOR XML PATH .

WITH Employee (ID, [Name], Profession, Country, Salary) AS (
SELECT 1, 'John Doe', NULL, 'USA', 5000 UNION ALL
SELECT 2, 'Jane Doe', 'Painter', NULL, NULL UNION ALL
SELECT 3, 'Jonas Doe', 'Butcher', 'England', 8000
)

SELECT *
FROM Employee
FOR XML PATH

sarebbe tornato

<row>
  <ID>1</ID>
  <Name>John Doe</Name>
  <Country>USA</Country>
  <Salary>5000</Salary>
</row>
<row>
  <ID>2</ID>
  <Name>Jane Doe</Name>
  <Profession>Painter</Profession>
</row>
<row>
  <ID>3</ID>
  <Name>Jonas Doe</Name>
  <Profession>Butcher</Profession>
  <Country>England</Country>
  <Salary>8000</Salary>
</row>

MODIFICARE

WITH Employee (ID, [Name], Profession, Country, Salary) AS (
SELECT 1, 'John Doe', NULL, 'USA', 5000 UNION ALL
SELECT 2, 'Jane Doe', 'Painter', NULL, NULL UNION ALL
SELECT 3, 'Jonas Doe', 'Butcher', 'England', 8000
)

SELECT ID, (SELECT * FROM Employee S WHERE S.ID = M.ID FOR XML PATH) [XML]
FROM Employee M

Restituirebbe una riga per ID con i suoi dati XML .



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow