Sql server 2005 如何在存储过程SQLServer2005中使用for循环

Sql server 2005 如何在存储过程SQLServer2005中使用for循环,sql-server-2005,tsql,stored-procedures,Sql Server 2005,Tsql,Stored Procedures,我是SQL server的新手。我的要求是我必须从c中获取数千条记录作为XML文件,并从该文件中获取临时表中的数据。从表中,我必须逐个检查记录是否存在,然后更新else insert。因此,我编写了一个存储过程,但它给出了以下错误 Msg 102,15级,状态1,程序 插入MyTable,第13行 不准确的 “cast”附近的语法。 味精102,第15级, 状态1,过程插入MyTable, 第18行 “LOOP”附近的语法不正确。 Msg 156,15级,状态1,程序 插入MyTable,第25

我是SQL server的新手。我的要求是我必须从c中获取数千条记录作为XML文件,并从该文件中获取临时表中的数据。从表中,我必须逐个检查记录是否存在,然后更新else insert。因此,我编写了一个存储过程,但它给出了以下错误

Msg 102,15级,状态1,程序 插入MyTable,第13行 不准确的 “cast”附近的语法。 味精102,第15级, 状态1,过程插入MyTable, 第18行 “LOOP”附近的语法不正确。 Msg 156,15级,状态1,程序 插入MyTable,第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\u float,我必须检查数据是否存在,如果存在,则更新else insert 结尾第二行case语句缺少逗号。选择字段必须始终用逗号分隔。在第二个case语句中,行尾的逗号丢失。 必须使用“开始”和“结束”来开始和结束循环。WHILE最好用在存储过程中,而不是用于。不确定sql server存储过程中是否有类似的。
在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

@vishal-请检查我的最新答案。已链接到有关WHILE循环用法的msdn文章。请检查并相应地修改您的SP。这将帮助你理解,而不是我给出完整的代码。哦,福克斯专业版扫描的好日子…结束扫描!有时候我真希望他们从来没有通过。