SQL Server - 是否可以将表列定义为表?

时间:2017-01-25 07:39:08

标签: sql-server

我知道这在Oracle中是可行的,我想知道SQL Server是否也支持它(搜索答案没有成功)。

如果我可以将表的一列定义为表本身,那么它将大大简化我在当前项目中的生活,例如:

Table A:
  Column_1    Column_2
+----------+----------------------------------------+
|     1    |   Columns_2_1       Column_2_2         |
|          |  +-------------+------------------+    |
|          |  |  'A'        |    12345         |    |
|          |  +-------------+------------------+    |
|          |  |  'B'        |    777777        |    |
|          |  +-------------+------------------+    |
|          |  |  'C'        |    888888        |    |
|          |  +-------------+------------------+    |
+----------+----------------------------------------+
|     2    |   Columns_2_1       Column_2_2         |
|          |  +-------------+------------------+    |
|          |  |  'X'        |    555555        |    |
|          |  +-------------+------------------+    |
|          |  |  'Y'        |    666666        |    |
|          |  +-------------+------------------+    |
|          |  |  'Z'        |    000001        |    |
|          |  +-------------+------------------+    |
+----------+----------------------------------------+

提前致谢。

2 个答案:

答案 0 :(得分:2)

有一个选项可以将数据存储为XML

Declare @YourTable table (ID int,XMLData xml)
Insert Into @YourTable values 
 (1,'<root><ID>1</ID><Active>1</Active><First_Name>John</First_Name><Last_Name>Smith</Last_Name><EMail>john.smith@email.com</EMail></root>')
,(2,'<root><ID>2</ID><Active>0</Active><First_Name>Jane</First_Name><Last_Name>Doe</Last_Name><EMail>jane.doe@email.com</EMail></root>')

Select ID 
      ,Last_Name  = XMLData.value('(root/Last_Name)[1]'  ,'nvarchar(50)')
      ,First_Name = XMLData.value('(root/First_Name)[1]' ,'nvarchar(50)')
 From @YourTable

返回

ID  Last_Name   First_Name
1   Smith       John
2   Doe         Jane

答案 1 :(得分:0)

实际上,对于规范化数据库,我们不需要这样的功能。 因为如果我们需要在列中插入一个表,那么我们可以创建一个子表并将其作为父表中的外键引用。

尽管如此,如果您仍然坚持使用此类功能,则可以使用SQL Server 2016来支持JSON数据,您可以在其中存储JSON格式的任何关联列表。 像:

DECLARE @json NVARCHAR(4000)
SET @json = 
N'{
    "info":{  
        "type":1,

        "address":{  
        "town":"Bristol",
        "county":"Avon",
        "country":"England"
        },
        "tags":["Sport", "Water polo"]
    },
    "type":"Basic"
}'

SELECT
    JSON_VALUE(@json, '$.type') as type,
    JSON_VALUE(@json, '$.info.address.town') as town,
    JSON_QUERY(@json, '$.info.tags') as tags

SELECT value
FROM OPENJSON(@json, '$.info.tags')

在旧版本中,这可以通过xml实现,如上一个答案中所示。

您也可以使用“sql_variant”数据类型映射表格。

以前,我也在寻找Oracle提供的功能。但在阅读了专家的各种文章和博客之后,我确信,这些功能会使事情变得更加复杂。 仅以所需格式存储数据并不重要,当它也有效可用(可读)时是值得的。

希望这会帮助您做出决定。