从SQL Server中的select query错误插入

时间:2016-04-24 20:56:46

标签: sql sql-server sql-server-2008

我使用以下查询将数据从一个表插入另一个表:

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
  关键字'SELECT'附近的语法不正确。

     

Msg 102,Level 15,State 1,Line 7
  ')'附近的语法不正确。

你能告诉我这里的错误吗?

3 个答案:

答案 0 :(得分:4)

您不需要VALUES关键字:

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

最好明确引用参与INSERT语句的两个表的每个字段名称。

答案 1 :(得分:2)

您不需要使用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);

答案 2 :(得分:1)

在这个问题上稍微扩展一下。

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

尽管在示例中经常使用INSERT INTO ... VALUES来插入行,但您可以使用它插入多行,用逗号分隔它们。

EG。 INSERT INTO表(col1,col2) 价值观(1,2)     ,(3,4)     ,(5,6)

会在表格中插入一组3行。

VALUES也可用于制作派生表,允许一些高级数据操作。

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