2016-04-24 64 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);