求助,执行行列转换后遇到了“列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。”的问题

人间十年 2023-03-08 14:17:19

我的代码如下:

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()(如图)。这样的方法需要将字段名都写死。

...全文
264 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
人间十年 2023-03-24
精选
  • 打赏
  • 举报
回复

可以结帖了,分享下解决思路。
最终没有修改程序,使用了excel软件里的【分列】功能将列数据格式更改为“文本”,测试后没有再次遇到问题。

雨夹雪 2023-03-10
  • 打赏
  • 举报
回复

你子查询里面的 cast 这些字段动态拼出来就可以了
你 IN 里面的 @sql 不也是 动态拼的嘛

人间十年 2023-03-13
  • 举报
回复
@雨夹雪 可以详细说说思路吗?谢谢
人间十年 2023-03-08
  • 打赏
  • 举报
回复

希望实现的效果:

| id |name | Fieldname | ValueField |
| ------ | ------ | ------ | ------ | ------ |
| 1 | 230308次 | 姓名 | 张三 |
| 2 | 230308次 | 性别 | 男 |
| 3 | 230308次 | 出生日期 | 1991-01-01 |

人间十年 2023-03-08
  • 打赏
  • 举报
回复

求助有没有不写死B表字段名就能实现类型转换的方式?

34,623

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧