Sql server 旋转SQL Server表
我有一个ULTRALEGACY db,其中,由于未知的原因(对我来说),参数表的结构如下:Sql server 旋转SQL Server表,sql-server,tsql,Sql Server,Tsql,我有一个ULTRALEGACY db,其中,由于未知的原因(对我来说),参数表的结构如下: |Parameter1|Parameter2|Parameter3|Parameter4 ... ------------------------------------------------ | Value1 | Value2 | Value3 | Value4 ... 几十个列和一行值(是的,对我来说也没有意义) 如何查询这些表以获得类似的结果 |Parameter|Value
|Parameter1|Parameter2|Parameter3|Parameter4 ...
------------------------------------------------
| Value1 | Value2 | Value3 | Value4 ...
几十个列和一行值(是的,对我来说也没有意义)
如何查询这些表以获得类似的结果
|Parameter|Value |
-----------------
|param1 |value1|
|param2 |value2|
|param3 |value3|
...
我刚刚设法得到了第一个专栏
SELECT COLUMN_NAME as Parameter
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='parameter_table_name'
但是我不知道如何获取值列,我想我必须要透视表,但我不知道如何做您需要的是
UNPIVOT
我的示例是固定数量的列,如果它是变量,则需要使用dynamic sql
获取它们的列表并构造UNPIVOT
语句
declare @t table (p1 int, p2 int, p3 int);
insert into @t values(1, 2, 3);
select param, val
from @t unpivot (val for param in (p1, p2, p3))u;
您需要的是
UNPIVOT
我的示例是固定数量的列,如果它是变量,则需要使用dynamic sql
获取它们的列表并构造UNPIVOT
语句
declare @t table (p1 int, p2 int, p3 int);
insert into @t values(1, 2, 3);
select param, val
from @t unpivot (val for param in (p1, p2, p3))u;
我想使用
交叉应用
select a.* from <table> t
cross apply(
values ('param1', t.Parameter1),
('param2', t.Parameter2),
('param3', t.Parameter3),
('param4', t.Parameter4)
) a(Parameter, Value)
我想使用
交叉应用
select a.* from <table> t
cross apply(
values ('param1', t.Parameter1),
('param2', t.Parameter2),
('param3', t.Parameter3),
('param4', t.Parameter4)
) a(Parameter, Value)
尝试PIVOT转换表格有多少列,您认为列的数量会有所不同吗?@DineshDB read last line:)@TimBiegeleisen columns number会随表格的不同而变化(是的,这里有更多的***)我正试图找到一个银弹查询,它适合每一个这样结构的表。您需要unpivot而不是pivotTry PIVOT来转换表有多少列,您是否希望列的数量会有所不同?@DineshDB read last line:)@TimBiegeleisen columns number会因表而异(是的,还有更多的这类***)我正试图找到一个银弹查询,它适合每一个这样结构的表。你需要unpivot而不是pivotnice!我如何处理不同的列类型?我不介意将所有列强制转换为varchari如果至少有两列不同类型的列不能转换为同一类型,你应该将所有列转换为varchar.SQL_VARIANT也是一个选项,但并非所有客户端都能识别它,并且需要额外的努力才能在以后的阶段正确处理它。很好!我如何处理不同的列类型?我不介意将所有列强制转换为varchari如果至少有两个不同类型的列无法转换为同一类型,则应转换所有列umns to varchars.SQL_VARIANT也是一个选项,但并非所有客户端都能识别它,在以后的阶段需要额外的努力才能正确处理它。太好了,我有很多列,每个表的名称都不同,所以我不能全部键入。太好了,我有很多列,每个表的名称都不同,所以我不能全部键入