Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
取消激活数据时如何保留索引(SQL Server)_Sql_Sql Server_Unpivot_Entity Attribute Value - Fatal编程技术网

取消激活数据时如何保留索引(SQL Server)

取消激活数据时如何保留索引(SQL Server),sql,sql-server,unpivot,entity-attribute-value,Sql,Sql Server,Unpivot,Entity Attribute Value,我试图将一个表解压为EAV格式,但希望在每一行保留一些额外的元数据 初始表格 | Brand | Name | Number | Col1 | Col2 | |-------|----------|--------|------|------| | A | Book | #1 | 1 | 2 | | B | Magazine | #2 | 1 | 2 | Declare @YourTable Table ([Bran

我试图将一个表解压为EAV格式,但希望在每一行保留一些额外的元数据

初始表格

| Brand | Name     | Number | Col1 | Col2 | 
|-------|----------|--------|------|------|
| A     | Book     | #1     | 1    | 2    | 
| B     | Magazine | #2     | 1    | 2    | 
Declare @YourTable Table ([Brand] varchar(50),[Name] varchar(50),[Number] varchar(50),[Col1] int,[Col2] int)
Insert Into @YourTable Values 
 ('A','Book','#1',1,2)
,('B','Magazine','#2',1,2)

Select A.Number
      ,C.*
 From  @YourTable A
 Cross Apply ( values ( convert(xml,(select a.* for xml raw ) ) ) ) B(XMLData)
 Cross Apply ( 
                Select [key] = xAttr.value('local-name(.)', 'varchar(100)')
                      ,Value = xAttr.value('.','varchar(max)')
                 From  B.XMLData.nodes('//@*') xNode(xAttr)
                 Where xAttr.value('local-name(.)', 'varchar(100)') not in ('Number')
             ) C 
所需输出

| Number | key   | val      | 
|--------|-------|----------|
| #1     | Brand | A        | 
| #1     | Name  | Book     | 
| #1     | Col1  | 1        |
| #1     | Col2  | 2        |
| #2     | Brand | B        |
| #2     | Name  | Magazine |
| #2     | Col1  | 1        |
| #2     | Col2  | 2        |
实际产出

| Number | key   | val      | 
|--------|-------|----------|
| #1     | Brand | A        | 
| #1     | Name  | Book     | 
| #1     | Col1  | 1        |
| #1     | Col2  | 2        |
| #2     | Brand | B        |
| #2     | Name  | Magazine |
| #2     | Col1  | 1        |
| #2     | Col2  | 2        |
列名“Number”无效

示例查询

select 
[Number], -- How can this be selected?
[key],
[val]
from (
  select
  [Number],
  [Brand],
  [Name]
  from [SomeTable]
) data
unpivot (
  [val]
  for [key] in (
    [Brand],
    [Name],
    [Number],
    [Col1],
    [Col2]
  )
) as unpiv

如何选择一个键值对以及相应的数字作为索引?

您可以使用一个
交叉应用
与一点XML配合使用

如果是2016+,则有一种JSON方法更具性能

示例

| Brand | Name     | Number | Col1 | Col2 | 
|-------|----------|--------|------|------|
| A     | Book     | #1     | 1    | 2    | 
| B     | Magazine | #2     | 1    | 2    | 
Declare @YourTable Table ([Brand] varchar(50),[Name] varchar(50),[Number] varchar(50),[Col1] int,[Col2] int)
Insert Into @YourTable Values 
 ('A','Book','#1',1,2)
,('B','Magazine','#2',1,2)

Select A.Number
      ,C.*
 From  @YourTable A
 Cross Apply ( values ( convert(xml,(select a.* for xml raw ) ) ) ) B(XMLData)
 Cross Apply ( 
                Select [key] = xAttr.value('local-name(.)', 'varchar(100)')
                      ,Value = xAttr.value('.','varchar(max)')
                 From  B.XMLData.nodes('//@*') xNode(xAttr)
                 Where xAttr.value('local-name(.)', 'varchar(100)') not in ('Number')
             ) C 
返回

Number  key    value
#1      Brand   A
#1      Name    Book
#1      Col1    1
#1      Col2    2
#2      Brand   B
#2      Name    Magazine
#2      Col1    1
#2      Col2    2
编辑-添加JSON版本(如果2016)+

Select A.Number
      ,B.*
 From  @YourTable A
 Cross Apply ( 
                Select [Key]
                      ,Value
                 From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper )) 
                 Where [Key] not in ('Number')
             ) B

这个表有100多个列,所以最好找到一个更具动态性的解决方案…@Matthew Sure。等等。@Matthew正如我所说的,如果2016+@Matthew总是乐意帮忙,JSON方法可能会更有效。注:我添加了一个JSON版本,如果2016+@Matthew我应该添加JSON版本,更好地处理有趣的列名,即特殊字符