Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL存储过程:在游标内部的while循环中,仅插入集合中的第一行_Sql Server_Stored Procedures - Fatal编程技术网

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)是我的错误。谢谢!!