Sql server 2005 如何在存储过程SQLServer2005中使用for循环
我是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”附近的语法不正确 存储过程: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
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。这将帮助你理解,而不是我给出完整的代码。哦,福克斯专业版扫描的好日子…结束扫描!有时候我真希望他们从来没有通过。