【问题标题】:include only attributes of a record which are not null仅包括不为空的记录的属性
【发布时间】:2018-08-24 09:37:12
【问题描述】:

来自stackoverflow的亲爱的人

我目前正在研究一种从数据库中导出数据的机制。每条记录大约有 30 个属性,我只想导出那些具有实际值的属性。

如果解释不够准确,举个例子:

+----+-----------+------------+---------+--------+
| 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

这些输出应在 XML 文件中生成。

如果可能的话,数据库中的每条记录都应该可以做到这一点。 我正在寻找一个函数来检查属性是否具有值,并根据该值将其添加到导出文件中。可惜我找不到类似的东西。

编辑: 到目前为止,我所做的只是编写查询以获取所有可能的属性:

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

【问题讨论】:

  • 从表中选择姓名,concat(Name,',', Profession ,',', Country,',',Salary)
  • 我也在考虑这个,但是如果可能的话导出格式应该是xml格式...所以我真的不知道如何申请。
  • 然后更新您的问题以显示您真正追求的是什么。您可以简单地添加FOR XML
  • 您也可以将逗号分隔值转换为 XML,但请发布您想要的内容...
  • 这样做了,非常感谢。我会试一试,让你知道结果如何

标签: sql-server tsql sqlbulkcopy


【解决方案1】:

您可以使用 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

会回来

<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>

编辑

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

每个ID 将返回一行,其中包含XML 数据。

【讨论】:

  • 这看起来很简单,但遗憾的是我需要为每条记录获取一个文件。我很感激你的回答!非常感谢!
  • @capojere 您可以为每个 ID 生成一行,为每个 ID 返回 XML,这至少可以为您提供生成文件所需的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多