2011-02-08 83 views
2

我是SQL服務器中的新成員。我的要求是我必須從c#中取得數千條記錄作爲XML文件,並從該文件取得臨時表中的數據。從表中我必須檢查一個接一個的記錄,如果它存在,則更新else插入。所以我寫了一個存儲過程,但它給我下面的錯誤如何在存儲過程中使用循環sql server 2005

消息102,級別15,狀態1,過程 InsertIntoMyTable,13號線
錯誤 附近的語法「投」。
Msg 102,Level 15, State 1,Procedure InsertIntoMyTable, Line 18
'LOOP'附近的語法不正確。
Msg 156,Level 15,State 1,Procedure InsertIntoMyTable,Line 25
關鍵字'END'附近語法不正確。

存儲過程:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE InsertIntoMyTable 
    @mytable xml 
AS 
BEGIN 
    SELECT 
    cast(colx.query('data(PointsliceId) ') as int) as PointSliceId, 
    cast(colx.query('data(Pt_timestamp) ') as datetime)  as Point_timestamp 
    cast(colx.query('data(FloatValue) ') as float)  as Float_Value 
INTo #TMP FROM @mytable.nodes('DocumentElement/mytable') AS Tabx(Colx) 


For IDX in (select * from TMP) 
LOOP 
if((select count(*) from PointValue_Float where PointSliceId=IDX.PointSliceId and Pt_timeStamp=IDX.Pt_timeStamp)>0)    
      update PointValue_Float set FloatValue=t.FloatValue from #TMP t where t.PointSliceId=PointValue_Float.PointSliceId and t.Pt_timeStamp=PointValue_Float.Pt_timeStamp 
else 
     insert into PointValue_Float(PointSliceId,Pt_timeStamp,FloatValue) SELECT PointSliceId,Pt_timeStamp,FloatValue FROM #TMP 
END LOOP 

END 
GO 
  • 我的表名是pointvalue_float這裏我要檢查數據是否存在與否,如果存在,則更新其他插入
+0

呵呵,Fox Pro的`scan ... endscan`好日子!有時候我希望他們永遠不會過去。 – 2011-02-08 08:59:53

回答

3

創建SQL Server過程中手動環始終是一個糟糕的主意 - SQL Server中的組數據工作 - 和你的說法也應面向集合的。

在你的情況,我會做的是這樣的:

  • XML分解到一個臨時表(因爲你已經做),基於連接狀態
  • 然後更新現有值
  • 除去從臨時表
  • 剩餘行需要插入
更新的那些行

所以你的代碼應該是這樣的:

CREATE PROCEDURE InsertIntoMyTable @mytable xml 
AS BEGIN 
    SELECT 
     colx.value('(PointsliceId)[1]', 'INT') AS PointSliceId, 
     colx.value('(Pt_timestamp)[1]', 'DATETIME') AS Point_timestamp 
     colx.value('(FloatValue)[1]', 'FLAOT') AS Float_Value 
    INTO #TMP 
    FROM @mytable.nodes('DocumentElement/mytable') AS Tabx(Colx) 

-- udpate the existing rows 
UPDATE dbo.PointValue_Float 
SET FloatValue = t.FloatValue 
FROM #TMP t 
WHERE t.PointSliceId = PointValue_Float.PointSliceId 
    AND t.Pt_timeStamp = PointValue_Float.Pt_timeStamp 

-- remove those from the #TMP table 
DELETE FROM #TMP 
WHERE EXISTS 
    (SELECT * FROM dbo.PointValue_Float 
    WHERE PointSliceId = #TMP.PointSliceId AND Pt_timeStamp = #TMP.Pt_timeStamp) 

-- INSERT the remaining rows  
INSERT INTO 
    dbo.PointValue_Float(PointSliceId, Pt_timeStamp, FloatValue) 
    SELECT 
    PointSliceId, Pt_timeStamp, FloatValue 
    FROM #TMP 
END 
0
  1. 你缺少第二行(案例陳述)末尾的逗號。選擇字段必須始終用逗號分隔。在你的情況下,第二個案例陳述,行尾的逗號缺失。
  2. 您必須使用BEGIN和END來開始和結束WHILE循環。 WHILE最好用於存儲過程而不是FOR。不確定在sql server存儲過程中是否有像FOR一樣的東西。
+0

請您詳細說明 – vishal 2011-02-08 06:29:58

相關問題