2015-08-18 105 views
0

我正在尋找將數據行插入另一個表的正常情況下的表中。SQL Server錯誤 - 子查詢返回的值超過1個

這裏是我當前的SQL腳本,

INSERT [dbo].[X_RPT_PORTAL_REPORTLIST] (
    [PORTAL_GROUP_ID], 
    [REPORT_DISPLAY_NAME], 
    [STANDARD_REPORT], 
    [REPORT_PACK_VERSION], 
    [REPORT_PATH] 
) 
VALUES (
    (SELECT ID FROM X_RPT_REPORTINGLIST), 
    (SELECT REPORT_NAME FROM X_RPT_REPORTINGLIST), 
    (SELECT STANDARD_REPORT FROM X_RPT_REPORTINGLIST), 
    (SELECT REPOPT_PACK_VERSION FROM X_RPT_REPORTINGLIST), 
    (SELECT PATH FROM ReportServer$PORTAL.dbo.Catalog) 
) 

現在我的錯誤,我不得不從這個回報率是:

消息512,級別16,狀態1,行1
子查詢返回不止1值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

我有一個想法,這可能是不正確的,但我需要一些指針來解決這個問題。

任何幫助或提示,非常感謝。

謝謝

回答

1

此問題的產生是因爲一個或多個已用於爲VALUES()提供數據的子查詢的已返回多個記錄。 使用VALUES()構造來插入一個且只有一個記錄。

這通常出現在人們使用WHERE條件(如WHERE value = (SELECT value FROM sub_table))且子查詢返回多條記錄時;這就是爲什麼錯誤信息精確的原因。

有可能遵循INSERT聲明以SELECT語句返回要放到表中的數據,所以考慮以下因素:

INSERT [dbo].[X_RPT_PORTAL_REPORTLIST] (
    [PORTAL_GROUP_ID], 
    [REPORT_DISPLAY_NAME], 
    [STANDARD_REPORT], 
    [REPORT_PACK_VERSION], 
    [REPORT_PATH]) 
SELECT 
    r.ID 
    ,r.REPORT_NAME 
    ,r.STANDARD_REPORT 
    ,r.REPOPT_PACK_VERSION 
    ,c.PATH 
FROM X_RPT_REPORTINGLIST r 
CROSS JOIN ReportServer$PORTAL.dbo.Catalog c; 
+0

我我剛剛意識到'PATH'來自'ReportServer $ PORTAL.dbo.Catalog'。哎呀......:$ –

0

您正在嘗試插入一行一表格,因此該行中的每列只能有一個值。這個錯誤意味着你的VALUES()子句中的一個或多個SELECT語句返回多個值。

分別運行每個SELECT語句,看看哪些語句返回多行,然後在必要時用WHERE子句約束它們,直到從每個語句中獲得所需的單個值。

0

我認爲錯誤信息是清楚的。你想切換到insert . . . select。類似這樣的:

INSERT [dbo].[X_RPT_PORTAL_REPORTLIST] ([PORTAL_GROUP_ID], [REPORT_DISPLAY_NAME], [STANDARD_REPORT], [REPORT_PACK_VERSION], [REPORT_PATH]) 
    SELECT rl.ID, rl.REPORT_NAME, rl.STANDARD_REPORT, rl.REPORT_PACK_VERSION, 
      c.PATH 
    FROM X_RPT_REPORTINGLIST JOIN 
     ReportServer$PORTAL.dbo.Catalog c 
     ON rl.??? = c.???; 

目前還不清楚JOIN條件是什麼。如果只有一條路徑,那麼你可能需要一個CROSS JOIN

0

你能做到這樣

INSERT [dbo].[X_RPT_PORTAL_REPORTLIST] ([PORTAL_GROUP_ID], [REPORT_DISPLAY_NAME], [STANDARD_REPORT], [REPORT_PACK_VERSION], [REPORT_PATH]) 
    SELECT 
     a.ID, a.REPORT_NAME, a.STANDARD_REPORT, a.REPOPT_PACK_VERSION, 
     b.PATH 
    FROM 
     X_RPT_REPORTINGLIST a 
    JOIN 
     ReportServer$PORTAL.dbo.Catalog b ON XXXXXXX 

而不是XXXX,你必須

0

運行以下查詢分別鍵入連接條件這兩個表。其中一些會返回導致錯誤的多行。你可以使用WHERE/GROUP BY/PARTITION來避免多行。

SELECT ID FROM X_RPT_REPORTINGLIST 
SELECT REPORT_NAME FROM X_RPT_REPORTINGLIST 
SELECT STANDARD_REPORT FROM X_RPT_REPORTINGLIST 
SELECT REPOPT_PACK_VERSION FROM X_RPT_REPORTINGLIST 
SELECT PATH FROM ReportServer$PORTAL.dbo.Catalog 
0

查詢的問題是所有的子查詢都返回多於1條記錄。
即:
(SELECT ID FROM X_RPT_REPORTINGLIST)行正在返回多於1條記錄,這在INSERT語句中是不允許的。

你可以用下面的代碼:

INSERT [dbo].[X_RPT_PORTAL_REPORTLIST] 
([PORTAL_GROUP_ID], [REPORT_DISPLAY_NAME], [STANDARD_REPORT], [REPORT_PACK_VERSION], [REPORT_PATH]) 
    VALUES (
    (SELECT top 1 ID FROM X_RPT_REPORTINGLIST), 
    (SELECT top 1 REPORT_NAME FROM X_RPT_REPORTINGLIST), 
    (SELECT top 1 STANDARD_REPORT FROM X_RPT_REPORTINGLIST), 
    (SELECT top 1 REPOPT_PACK_VERSION FROM X_RPT_REPORTINGLIST), 
    (SELECT top 1 [PATH] FROM ReportServer$PORTAL.dbo.Catalog)) 

注:從路徑更改列名(這是一個關鍵字),以[路徑]

0

嘗試這樣

INSERT INTO [dbo].[X_RPT_PORTAL_REPORTLIST] 
([PORTAL_GROUP_ID], [REPORT_DISPLAY_NAME], [STANDARD_REPORT], [REPORT_PACK_VERSION], [REPORT_PATH]) 
    SELECT rl.ID, rl.REPORT_NAME, rl.STANDARD_REPORT, rl.REPOPT_PACK_VERSION, c.PATH 
    FROM X_RPT_REPORTINGLIST rl 
    INNER JOIN ReportServer$PORTAL.dbo.Catalog c ON c.Name = rl.REPORT_NAME 
相關問題