Sql server T-SQL存储过程:在游标内部的while循环中,仅插入集合中的第一行
我对这个存储过程有问题 我的应用程序中的参数定义得很好,但在这个过程中,当我试图在表Sql server T-SQL存储过程:在游标内部的while循环中,仅插入集合中的第一行,sql-server,stored-procedures,Sql Server,Stored Procedures,我对这个存储过程有问题 我的应用程序中的参数定义得很好,但在这个过程中,当我试图在表Image中插入一行时,它只插入@xmlmages中的第一行,我发送了两个值。谢谢你的帮助 CREATE PROCEDURE sp_AddExplanationAndImage @Text NVARCHAR(MAX) = NULL, @ID INT = 0 @ListOfImages NVARCHAR(MAX) = NULL AS BEGIN INSERT INTO dbo.Exp
Image
中插入一行时,它只插入@xmlmages
中的第一行,我发送了两个值。谢谢你的帮助
CREATE PROCEDURE sp_AddExplanationAndImage
@Text NVARCHAR(MAX) = NULL,
@ID INT = 0
@ListOfImages NVARCHAR(MAX) = NULL
AS
BEGIN
INSERT INTO dbo.Explanation (ID, Text)
VALUES (@ID, @Text)
DECLARE @xmlImages xml
SET @xmlImages = CAST(@ListOfImages AS xml)
DECLARE @ImageExtension NVARCHAR(MAX)
DECLARE @Name NVARCHAR(MAX)
DECLARE @Content VARBINARY(MAX)
IF (@ListOfImages IS NOT NULL)
BEGIN
DECLARE cursor cursor for--local fast_forward for
SELECT
s.x.value('(Image/Extension)[1]', 'nvarchar(max)'),
s.x.value('(Image/Name)[1]', 'nvarchar(max)'),
s.x.value('(Image/Content)[1]', 'varbinary(max)')
FROM
@xmlImages.nodes('Images') AS s(x)
OPEN CURSOR
FETCH NEXT FROM cursor INTO @ImageExtension, @Name, @Content
WHILE @@FETCH_STATUS = 0
BEGIN
IF @@fetch_status <> 0
BREAK
INSERT INTO dbo.Image (Extension, Name, Content)
SELECT @ImageExtension, @Name, @Content
FETCH NEXT FROM cursorSlike INTO @ImageExtension, @Name, @Content
END
CLOSE cursor
DEALLOCATE cursor
END
创建过程sp\u AddExplanationAndImage
@文本NVARCHAR(最大)=空,
@ID INT=0
@ListOfImages NVARCHAR(最大)=空
作为
开始
插入dbo.解释(ID,文本)
值(@ID,@Text)
声明@xmlmages-xml
设置@xmlmages=CAST(@ListOfImages为xml)
声明@ImageExtension-NVARCHAR(最大值)
声明@Name NVARCHAR(最大值)
声明@Content VARBINARY(最大值)
如果(@ListOfImages不为空)
开始
为--local fast_forward声明游标
挑选
s、 x.值('(图像/扩展)[1],'nvarchar(最大)',
s、 x.值(“(图像/名称)[1]”、“nvarchar(最大值)”,
s、 x.value('(图像/内容)[1],'varbinary(max)'
从…起
@节点('Images')作为s(x)
打开光标
将下一个从游标提取到@ImageExtension、@Name、@Content中
而@@FETCH\u STATUS=0
开始
如果@@fetch\u状态为0
打破
插入dbo.Image(扩展名、名称、内容)
选择@ImageExtension、@Name、@Content
从cursorSlike获取下一个到@ImageExtension、@Name、@Content
结束
关闭光标
释放光标
结束
从内的获取下一步,而块不引用正在循环的光标。您将光标命名为cursor
(顺便说一句,我建议使用更具描述性的名称),但下一步将从cursorSlike
获取
但我不确定您首先是否需要循环(通常,您应该避免在SQLServer中使用循环,除非没有其他方法来完成此任务)。我在SQL Server中没有对XML做过很多工作,但您尝试过吗
INSERT INTO dbo.Image(Extension,Name,Content)
SELECT
s.x.value('(Image/Extension)[1]','nvarchar(max)'),
s.x.value('(Image/Name)[1]','nvarchar(max)'),
s.x.value('(Image/Content)[1]','varbinary(max)')
FROM @xmlImages.nodes('Images')AS s(x)
根据你的样本数据。您需要获取图像/Image
节点。您不需要使用游标
INSERT INTO dbo.Image(Extension,Name,Content)
SELECT
s.x.value('(Extension)[1]','nvarchar(max)'),
s.x.value('(Name)[1]','nvarchar(max)'),
s.x.value('(Content)[1]','nvarchar(max)')
FROM @xmlImages.nodes('Images/Image')AS s(x)
您还可以添加您的xml数据吗?并且您不需要使用游标。您可以从xml中插入选择这是我的xml源代码:jpg picture1 0x4C006A0069006C006A00610043005600 jpg picture2 0x4A006F00760061006E0043005600我也尝试从xml中选择插入到表图像中,但是它给了我同样的结果。旁注:您不应该在存储过程中使用sp\uu
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp.
并使用其他东西作为前缀,或者根本不使用前缀!是的,我尝试了这个,也在查询窗口中测试以查看结果,它只给了我这个xml中的第一个图像:DECLARE@xmlmimage xml SET@xmlmimage=CAST('jpg 14124198_1220921057958339_619735749_o jpg 14124191_1220921161291662_714654791_o'AS xml)选择s.x.value('(图像/扩展名)[1],'nvarcharchar(max'),将@xmlmimage.nodes('Images')中的s.x.value('(Image/Name)[1],'nvarchar(max')替换为s(x)是的,这解决了我的问题,我更改了XPath!我把@xmlmages.nodes('Image')写成s(x)是我的错误。谢谢!!