INSERT INTO使用SubQuery和一些操作

时间:2012-01-12 22:09:12

标签: sql sql-server-2005

我正在尝试向表中插入一些数据包含两件事:“一个字符串”和“Order列中的最大数字+ 1”。

这是我的疑问:

INSERT INTO MyTable ([Text],[Order]) 
SELECT 'MyText' , (Max([Order]) + 1) 
FROM MyTable

我的查询出了什么问题?

我正在使用Microsoft SQL Server 2005 SP3。

3 个答案:

答案 0 :(得分:3)

您可以像这样测试此查询:

我没有收到错误:

create table #MyTable
(
    [Text] varchar(40),
    [Order] int NOT NULL
)
INSERT INTO #MyTable([Text],[Order]) 
SELECT 'MyText' [Text], isnull(max([order]) + 1, 0) [Order] 
FROM #MyTable

drop table #MyTable

原件:

INSERT INTO MyTable ([Text],[Order]) 
SELECT 'MyText' [Text], max([Order]) + 1 [Order] 
FROM MyTable

INSERT INTO MyTable ([Text],[Order]) 
SELECT top 1 'MyText' [Text], max([Order]) + 1 [Order] 
FROM MyTable
据我所知,

限制在SQL Server中无效。

答案 1 :(得分:3)

除非他有一个名为OrderBy的列

然后他必须添加/分配该Insert中的所有值,尤其是当列不允许空值时 听起来像使用dbo完全限定插入.MyTable.Field可能更有意义。 你也为什么用SQL关键字命名字段...... ???

INSERT INTO MyTable ([Text],[Order] Values('MyTextTest',1)

首先尝试测试插入..

答案 2 :(得分:3)

  

无法将值NULL插入“Order”列,表'master.dbo.MyTable';列不允许空值。 INSERT失败。声明已经终止。

这意味着Order列不允许为空,,列的Max([Order]) + 1部分返回NULL。 这是因为你的桌子是空的,正如你自己已经注意到的那样。

您可以使用ISNULL()通过查询中的实数替换NULL来解决此问题:

INSERT INTO MyTable ([Text],[Order]) 
SELECT 'MyText' , (isnull(Max([Order]),0) + 1) 
FROM MyTable