T-SQL中向表中插入一条数据,其中类型为Decimal的列对应的插入值为‘2400’可就是不行还报“......

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL中向表中插入一条数据,其中类型为Decimal的列对应的插入值为‘2400’可就是不行还报“......相关的知识,希望对你有一定的参考价值。

T-SQL中向表中插入一条数据,其中类型为Decimal的列对应的插入值为‘2400’可就是不行还报“将截断字符串或二进制数据“,为什么呢求解(decimal类型不会用)

我这没问题的,你看下你设置的长度

 

9,2代表9位有效数字,小数点后2位

追问

唉,搞不懂耶╮(╯▽╰)╭

追答

我拿你的表试试,等一下

--------------补充------------

你好几个varchar没设置长度,默认长度就是1了

这样一下

运行一下这两句

alter table hos_house alter column topic varchar(50)
alter table hos_house alter column contents varchar(50)追问

是丫明白啦谢谢啦,亲(*^__^*) 嘻嘻

参考技术A 如果的确是这个字段被截断,那么你就要看一下你定义的DECIMAL类型变量的精度和小数位数。
DECLMAL(5,1)或DECIMAL(4,0)输入2400就不会被截断。
其中括号中第一个数字是十进制位数(包括小数位),第二个是小数位数。
你要是DECIMAL(5,2)这样只存存储三位整数和两位小数,你的数据就会被截断
一般定议:DECIMAL(12,4)就能够满足大多数要求追问

大神,求解?

追答

问题在你的VARCHAR类型的几个字段,没有定义长度,而默认长度为1,就是说明超过一个字就不行了。
就是TOPIC VARCHAR NOT NULL

和CONTENTS VARCHAR NOT NULL
写成
TOPIC VARCHAR(100) NOT NULL

CONTENTS VARCHAR(100) NOT NULL
就行了。

你那个PRICE字段精度是9,小数位是2,最大可以写到9999999.99是没问题的。
所以,你应该检查一下是不是由于其它字段造成的

追问

嗯嗯,varchar忘了给长度啦默认为1啦,是吖谢谢哈

本回答被提问者采纳
参考技术B 不是这个字段的原因
看看其他字段追问

改了怎么还不行呐,唉求解

追答

Topic,Contents,怎么不定义长度?
你试试
insert into HOS_HOUSE(UID,HID,HTID,Price,topic,contents,HTIME,COPY) values(1,1,2,2400,'','',getdate(),'')
肯定不会出错

兄弟,别用外键哦,这个会很麻烦的,尤其是你系统有点复杂的话

追问

o(︶︿︶)o 唉,又马虎啦,竟然忘定义长度了,谢谢啦!!!(*^__^*) 嘻嘻

如何从视图中向表中插入值

【中文标题】如何从视图中向表中插入值【英文标题】:How to insert values in a table from a view 【发布时间】:2015-12-04 06:13:17 【问题描述】:

我有一个视图,我必须在表中插入值。观点如下:

Author_ID   Research_Area   Category    Paper_Count Paper_Year  Rank
--------------------------------------------------------------------
677         feature         8           1           2005        1
677         image           11          1           2005        2
677         retrieval       12          1           2005        3
677         semantic        19          1           2007        1
677         feature         8           1           2009        1
677         video           5           2           2013        1
1359        image           11          2           2005        1
1359        adversary       1           1           2005        2
1359        archiving       12          1           2005        3
1359        linear          1           3           2006        1
1359        real time       17          3           2006        2
...  
...  

表格如下:

id   Author_ID   Category_2005   Category_2006   Category_2007.....Category_2014   Rank
---------------------------------------------------------------------------------------  

我必须根据每个Paper_Year 的排名插入每个Author_ID 并且每个Author_ID 具有三个Category 列的值,一些Author_ID 可能没有一些Paper_Year 的值所以必须为没有Category 值的Paper_Years 插入0,而每个Author_ID 应该只在结果表中显示3 次。

我只为Paper_Year 尝试过这个,即2005

UPDATE A
SET A.aid       =   (SELECT vA.Author_ID 
                     FROM Author_Area vA 
                     WHERE vA.Paper_Year = 2005 AND vA.Rank = 1),
A.Category_2005 =   (SELECT vA.Category 
                     FROM Author_Area vA 
                     WHERE vA.Paper_Year = 2005 AND vA.Rank = 1)
FROM Author_Areas A  

但无法更新表中的任何行。那么在这种情况下我应该使用INSERTUPDATE 并且可以使用CASE 语句,如果可以,那么如何使用?

此外,我在结果表中的输出应该是这样的:

id   Category_2005   Category_2006   Category_2007 ...   Category_2014   Rank
-----------------------------------------------------------------------------
677  8               0               19                  0               1
677  11              0               0                   0               2
677  12              0               0                   0               3
1359 11              1               0                   1               1
1359 1               17              0                   0               2
1359 12              0               10                  0               3
...
...

【问题讨论】:

【参考方案1】:

我假设您想在表中创建新行? 另外,我假设id 列是主键IDENTITY 列?

您只是想找到一种旋转方式(即actually a language feature)。在这种情况下,不使用PIVOT 语法相对容易编写,只需使用过滤聚合(MAXCASE 内部)。

INSERT INTO Author_Areas (
  ID,
  Category_2005,
  Category_2006,
  Category_2007,
  Category_2008,
  Category_2009,
  Category_2010,
  Category_2011,
  Category_2012,
  Category_2013,
  Category_2014,
  Rank
)
SELECT Author_ID,
  MAX(CASE WHEN Paper_Year = 2005 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2006 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2007 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2008 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2009 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2010 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2011 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2012 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2013 THEN category ELSE 0 END),
  MAX(CASE WHEN Paper_Year = 2014 THEN category ELSE 0 END),
  Rank
FROM
  Author_Area
GROUP BY
  Author_ID, Rank

【讨论】:

你需要描述你想用这些值做什么。您的示例查询只是忽略了它们,所以我的解决方案也是。 我已经更新了我的答案,每个作者每个等级插入一行。 @Jeff--我已经显示了结果表,它应该是什么样子 @Jeff--“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Author_Areas' 中插入标识列的显式值。”这是错误,而我的身份规范设置为是 让我们continue this discussion in chat.

以上是关于T-SQL中向表中插入一条数据,其中类型为Decimal的列对应的插入值为‘2400’可就是不行还报“......的主要内容,如果未能解决你的问题,请参考以下文章

如何从视图中向表中插入值

八SQL Server(T-SQL)数据语言操作

八SQL Server(T-SQL)数据语言操作

八SQL Server(T-SQL)数据语言操作

八SQL Server(T-SQL)数据语言操作

java中怎么一次性向表中插入一条或多条数据