【问题标题】:How to insert into one table from another table with datatype conversions and value manipulations如何通过数据类型转换和值操作从另一个表插入一个表
【发布时间】:2015-07-08 15:19:43
【问题描述】:

我需要编写一个查询,将数据从 TableA 插入到 TableB

如果TableB中已经存在数据,则不要插入。

TableA 是一个表,其中包含使用 SSIS 包导入的数据,所有字段均为 varchar 数据类型。

TableB 是一个包含不同数据类型字段的表。

进行插入时,我需要将来自TableA 的数据插入TableB,确保TableB 以正确的格式获取数据。

这是一个TableA,其中的数据使用SSIS 导入为varchar,请输入所有内容:

这是TableB的结构:

我正在编写以下查询:

insert into
TableB(Date,Receipt,Description,CardMember,AccountNumber,Amount,YYYYMM)
select Date,Receipt,Description,CardMember,AccountNumber,Amount, 
convert(varchar(4), year(getdate())) + convert(varchar(2), 
month(getdate())) from TableA a
where not exists(select 1 from TableB b where 
b.CardMember = a.CardMember) and (convert(varchar(4), year(getdate()))
+ convert(varchar(2), month(getdate()))) = b.YYYYMM

TableB 中的YYYYMM 列应包含YYYYMM 数据,其中YYYY 是当前年份,MM 是当前月份。

例如:

year(GetDate()) = 2015
month(GetDate()) = 7

我在找 201507

所以,查询成功执行后,我的 TableB 看起来像这样:

我的查询在某处出错,执行时出现以下错误:

消息 102,级别 15,状态 1,第 1 行 'id' 附近的语法不正确。消息 102,第 15 级,状态 1,第 4 行 'YYYYMM' 附近的语法错误。

正确的做法是什么?

【问题讨论】:

  • 您引用的别名 tt 以前没有在任何地方定义过。
  • 我更新了SQL语句。

标签: sql sql-insert


【解决方案1】:

最后一个字段是一个 int。不要像你一样使用 varchar 函数来填充它:

convert(varchar(4), year(getdate())) + convert(varchar(2), 
month(getdate()))

相反,只需添加整数:

datepart(yyyy,getdate())*100 + datepart(mm,getdate())

【讨论】:

  • 那么,基本上datepart返回的数据类型是整数?
  • convert(char(6),getDate(),112) 怎么样?如果使用这种方式,如果我需要将结果与整数字段进行比较,是否应该将其转换为整数?
  • 你只是在自找麻烦。当 int 使用较少的数据时,为什么要使用 char。 convert(char(6),getDate(),112) 适合输出给用户。但如果是用于表格插入,请使用整数。如果您需要比较它们,我会将 int 转换为 char 而不是将 char 转换为 int。这样错误更少。
  • 谢谢您的解释
猜你喜欢
  • 2023-03-17
  • 2019-07-18
  • 2012-04-29
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多