2016-04-24 63 views
0

我使用下面的查询从一个表中的数据插入到另一个:在SQL Server中插入从选择查询错误

DECLARE @MATNO NVARCHAR(10), @GLOBALREV INT, @LOCALREP INT 

SET @MATNO = '7AGME' 
SET @GLOBALREV = 11 
SET @LOCALREP = 1 

INSERT INTO CIGARETTE_HEADER 
VALUES 
    (SELECT * 
    FROM CIGARETTE_HEADER_BK1 
    WHERE MATERIAL_NUMBER = @MATNO 
     AND GLOBAL_REVISION = @GLOBALREV 
     AND LOCAL_REVISION = @LOCALREP) 

列在两个表是相同的,但我得到了以下错误:

Msg 156, Level 15, State 1, Line 7
Incorrect syntax near the keyword 'SELECT'.

Msg 102, Level 15, State 1, Line 7
Incorrect syntax near ')'.

您能否让我知道这里的错误?

回答

1

要在这个问题上扩大一点。

VALUES()实际上是一个表构造函数。 将行插入表中时,您可以使用SELECT来获取行或VALUE构造函数。

即使INSERT INTO ... VALUES经常用于插入一行的示例,您可以使用它插入多行,并用逗号分隔它们。

例如, INSERT INTO表(COL1,COL2) VALUES(1,2) ,(3,4) ,(5,6)

会插入一组3个行到表格中。

VALUES还可以用来制作派生表,允许一些高级数据操作。

https://msdn.microsoft.com/en-us/library/dd776382.aspx

3

你不需要VALUES关键字:

INSERT INTO CIGARETTE_HEADER 
SELECT * FROM CIGARETTE_HEADER_BK1 
WHERE MATERIAL_NUMBER = @MATNO AND 
     GLOBAL_REVISION = @GLOBALREV AND 
     LOCAL_REVISION = @LOCALREP 

这也是最好明确援引参与INSERT声明两个表的每个字段名称。

+0

谢谢!它工作....但为什么在这里不需要values关键字...如果我们使用VALUES关键字,那么我们必须使用所有列名称? –

+0

@RanitDas'VALUES'用于您希望将特定值插入到表中的情况。然而这个查询使用'INSERT INTO SELECT',它具有不同的语法(没有'VALUES')。 –

1

您不需要使用VALUES()表示法。只有当你想要插入静态值和只有一个寄存器时才使用它。例如: INSERT INTO表 VALUES('value1',12,newid());

而且我建议写你打算插入的列的名称,就像这样:

INSERT INTO Table 
(String1, Number1, id) 
VALUES('value1',12, newid()); 

在你的情况,做同样的,但只有选择:

DECLARE @MATNO NVARCHAR(10), @GLOBALREV INT, @LOCALREP INT; 

SET @MATNO = '7AGME'; 
SET @GLOBALREV = 11; 
SET @LOCALREP = 1; 

INSERT INTO CIGARETTE_HEADER 
(ColumnName1, ColumnName2) 
SELECT ColumnNameInTable1, ColumnNameInTable2 
FROM CIGARETTE_HEADER_BK1 
WHERE MATERIAL_NUMBER = @MATNO 
AND GLOBAL_REVISION = @GLOBALREV 
AND LOCAL_REVISION = @LOCALREP);