Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 当表具有不同的数据类型时,无法将列转换为行_Sql_Sql Server_Cross Apply - Fatal编程技术网

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