Sql 当表具有不同的数据类型时,无法将列转换为行
我有一张如下表:Sql 当表具有不同的数据类型时,无法将列转换为行,sql,sql-server,cross-apply,Sql,Sql Server,Cross Apply,我有一张如下表: Create table EmpDetails ( ID int primary key, DOB datetime not null, Name nvarchar(100) not null, Salary float not null, Email nvarchar(50) not null, IsActive bit not null ) Insert into EmpDetails VALUES (2134, '1985
Create table EmpDetails
(
ID int primary key,
DOB datetime not null,
Name nvarchar(100) not null,
Salary float not null,
Email nvarchar(50) not null,
IsActive bit not null
)
Insert into EmpDetails VALUES (2134, '1985-09-19 03:37:21.757', 'Jack Sparrow', 75000,'abc@gmail.com', 1)
当我尝试使用下面的查询将列转换为行时,我遇到错误,查询失败
select ID, Attrib, Value
from EmpDetails
cross apply
(
select 'DOB', DOB union all
select 'Name', Name union all
select 'Salary', Salary union all
select 'Email', Email union all
select 'IsActive', IsActive
)empd(Attrib, Value);
编辑:我也尝试了下面的内容,但得到了相同的错误
select ID, Attrib, Value
from EmpDetails
cross apply
(
values
('DOB', DOB),
('Name', Name),
('Salary', Salary),
('Email', Email),
('IsActive', IsActive)
) empd(Attrib, Value);
错误:
Conversion failed when converting date and/or time from character string.
当我试图将DOB字段强制转换为datetime
时,仍然出现相同的错误:
select 'DOB', CAST(DOB as datetime)
我怎样才能在这里继续?非常感谢您的帮助。因为您正在进行联合,所以所有数据类型都应该匹配。试试下面的
select ID, Attrib, Value
from EmpDetails
cross apply
(
select 'DOB' , CONVERT(NVARCHAR(50),DOB , 121) union all
select 'Name' , CAST(Name AS NVARCHAR(50)) union all
select 'Salary' , CAST(Salary AS NVARCHAR(50)) union all
select 'Email' , CAST(Email AS NVARCHAR(50)) union all
select 'IsActive', CAST(IsActive AS NVARCHAR(50))
)empd(Attrib, Value);
或
结果
更新
对于values语法,您需要将所有列值强制转换为一种数据类型,如下所示
select ID, Attrib, Value
from EmpDetails
cross apply
(
values
('DOB' , CONVERT(NVARCHAR(50),DOB , 121)),
('Name' , CAST(Name AS NVARCHAR(50)) ),
('Salary' , CAST(Salary AS NVARCHAR(50))),
('Email' , CAST(Email AS NVARCHAR(50))),
('IsActive', CAST(IsActive AS NVARCHAR(50)))
) empd(Attrib, Value);
为什么不将它们全部转换为相同的数据类型,而不是一些作为
varchar
和一些作为nvarchar
?我投了反对票,因为a)你没有解释OP的代码不起作用的原因,“所有数据类型都应该匹配”是错误的,b)你的代码没有像你所说的那样(正如蓝脚所指出的)@M.Ali感谢你的回答。但是,如果我使用值(…)而不是union all,我将得到相同的错误。是因为同样的原因吗?我已经更新了问题,即使您使用的是值语法
,您也需要将所有列转换为相同的数据类型。它将解决这个问题。
╔══════╦══════════╦═════════════════════════╗
║ ID ║ Attrib ║ Value ║
╠══════╬══════════╬═════════════════════════╣
║ 2134 ║ DOB ║ 1985-09-19 03:37:21.757 ║
║ 2134 ║ Name ║ Jack Sparrow ║
║ 2134 ║ Salary ║ 75000 ║
║ 2134 ║ Email ║ abc@gmail.com ║
║ 2134 ║ IsActive ║ 1 ║
╚══════╩══════════╩═════════════════════════╝
select ID, Attrib, Value
from EmpDetails
cross apply
(
values
('DOB' , CONVERT(NVARCHAR(50),DOB , 121)),
('Name' , CAST(Name AS NVARCHAR(50)) ),
('Salary' , CAST(Salary AS NVARCHAR(50))),
('Email' , CAST(Email AS NVARCHAR(50))),
('IsActive', CAST(IsActive AS NVARCHAR(50)))
) empd(Attrib, Value);