2011-09-08 44 views
0

我有以下SQL查詢:插入使用變量

Declare @Total_SysDown as int, 
     @Login_SysDown as int 



Set @Total_SysDown = (SELECT SCHED_SYS_DOWN FROM AGT_SC AS S) 
Set @Login_SysDown = (SELECT SYS_DOWN FROM AGT_AC AS A) 


Insert Into dbo.DATA(DATE,ID,LNAME,FNAME,Total_SysDown,Login_SysDown) 
Select C.DATE,C.ID,E.Last_Name,E.First_Name,@Total_SysDown @Login_SysDown 
From dbo.AGT as C Inner Join dbo.EMP as E ON C.ID = E.ID 
Group by C.ID,C.DATE,E.Last_Name,E.First_Name 

這或只是與SELECT語句中的變量給我的子查詢返回錯誤大於1倍的值。據我所知,這意味着我應該一次插入一條記錄,但我不確定如何做到這一點。有沒有我應該投入的一段時間陳述,還是我的變數實際上首先妨礙了我?

+0

AGT_SC和AGT_AC的值與AGT或EMP有什麼關係?有沒有ID –

回答

4

至少查詢之一:

(SELECT SCHED_SYS_DOWN FROM AGT_SC AS S) 
(SELECT SYS_DOWN FROM AGT_AC AS A) 

回報超過1行以上,所以你不能把它分配給一個標量。

作爲臨時解決方案,您可以執行SELECT TOP 1以確保每個查詢最多返回一行。

+1

+1。同意@ a1ex07。如果你這樣做,選擇TOP 1 ....將永遠不會失敗,但我不知道這是否是你的意圖。 – Icarus

+0

好的,但是如果我想要插入多行,我必須做些什麼才能讓select逐步走下表格行? – Jessica

+1

您可以聲明'table'類型的變量(或創建臨時表),填充並使用'INSERT INTO ... SELECT'。您也可以避免創建表變量,並使用派生查詢。最後,您可以使用遊標(通常這是一個不錯的選擇,但有時不可避免) – a1ex07

1

我不認爲問題與您的INSERT語句完全相同。

您的問題在SET語句中。 SELECT SCHED_SYS_DOWN FROM AGT_SC AS S語句或其他語句返回多個值。

當您使用SET時,您將爲變量賦值ONE值。您的SELECT正在返回多個值。將您的查詢更改爲僅返回一行。

1

,因爲你的子查詢返回多個記錄您收到此錯誤:,或者通過使用

Set @Total_SysDown = (SELECT SCHED_SYS_DOWN FROM AGT_SC AS S) 
Set @Login_SysDown = (SELECT SYS_DOWN FROM AGT_AC AS A) 

在這裏使用的變量,你需要確保只有一個記錄是從查詢返回WHERE子句,TOP 1或其他內容。我無法確定您的示例,但聽起來您應該將這些表連接到您的SELECT查詢。

SELECT ... 
FROM dbo.AGT agt 
    INNER JOIN AGT_SC sc 
     ON sc.<joining column> = <joining table>.<joining column> 
    INNER JOIN AGT_AC ac 
     ON ac.<joining column> = <joining table>.<joining column> 
+0

我試過加入,但我得到了同樣的錯誤。使用前1,查詢可以工作(每行顯然都有相同的變量數據)。我會試圖找出如何插入where子句。 – Jessica

+1

你想從那張桌子上得到什麼?與AGT.ID匹配的單個值? –

+0

非常。我想從變量中獲取該代理的日期,ID,名稱和值。我需要爲源表中的每一行執行此操作。 – Jessica