34,835
社区成员




我的代码如下:
DECLARE @sql NVARCHAR(4000)
SELECT @sql=isnull(@sql+',','')+quotename(Name)
FROM tempdb.dbo.syscolumns
WHERE ID=object_id('tableB') AND Name NOT IN('id','name')
ORDER BY Colid ;
PRINT (@SQL);
set @sql='INSERT INTO [dbo].[tableA] SELECT
id,name,
[Fieldname] ,
[ValueField]
FROM tableB UNPIVOT ([ValueField] FOR [Fieldname] IN ( '+@sql+' ) ) unpiv '
print(@sql)
exec(@sql)
想实现的效果是将B表的数据经过行列转换后保存到A表中。
目前知道问题发生原因是因为B表中有些字段的数据类型是时间类型,需要经过类型转换才能保存到A表中。
因为B表中除了id和name是固定不变的字段名外,其他字段名称是会有变化的(值也会变,有时时间有时文本)。
看到过一些参考资料都是将tableB里面的每一列都cast()(如图)。这样的方法需要将字段名都写死。
可以结帖了,分享下解决思路。
最终没有修改程序,使用了excel软件里的【分列】功能将列数据格式更改为“文本”,测试后没有再次遇到问题。
希望实现的效果:
| id |name | Fieldname | ValueField |
| ------ | ------ | ------ | ------ | ------ |
| 1 | 230308次 | 姓名 | 张三 |
| 2 | 230308次 | 性别 | 男 |
| 3 | 230308次 | 出生日期 | 1991-01-01 |
求助有没有不写死B表字段名就能实现类型转换的方式?