0

xml 入力を介して 2008 SQL サーバー テーブルに新しいレコードを挿入するストアド プロシージャがあります。

CREATE PROCEDURE ins_AddBinsToBox
@BoxId          BIGINT,
@BinIds         XML
AS
BEGIN

INSERT INTO WebServiceBoxDetails 
(
  BinId,
  BoxId 
)
SELECT 
  ParamValues.ID.value('.','VARCHAR(20)'),
  @BoxId  
FROM 
  @binIds.nodes('/Bins/id') AS ParamValues(ID)  

これは新しい行を挿入するのに最適です。私が混乱しているのは、(UPDATE ステートメントを介して) この同じテーブルを新しい xml 入力で更新することですか?

テーブル:

Id(PK)    BoxNumber  BinId
(bigint)  (bigint)   (int)
_______________________
1           12         334
2           12         445
3           12         776
4           16         223
5           16         669

使用するコマンド:

EXEC upd_Box @binIds='<Bins><id>7848</id><id>76554</id><id>71875</id></Bins>', @BoxId=12
4

3 に答える 3

1

遅れて申し訳ありません。これが2番目の部分の答えです(これは更新と挿入の両方で機能するはずです)

DECLARE @binIds AS XML = '<Bins><id>44</id><id>55</id><id>66</id><id>77</id></Bins>'
DECLARE @id INT
DECLARE @newid INT
DECLARE @count INT = 1
DECLARE @BinIdTable TABLE(RowNumber INT, BinId INT) 
DECLARE @BoxNumber INT = 12
DECLARE @RowCount INT = 0

INSERT @BinIdTable(RowNumber, BinId)
SELECT ROW_NUMBER() OVER(ORDER BY ID), ParamValues.ID.value('.','INT')
FROM
 @binIds.nodes('/Bins/id') AS ParamValues(ID)

SELECT @RowCount = COUNT(*) FROM @BinIdTable

DECLARE MyCursor CURSOR FOR
 SELECT id FROM WebServiceBoxDetails WHERE BoxNumber = @BoxNumber ORDER BY id

 OPEN MyCursor

 FETCH NEXT FROM MyCursor
 INTO @id

 WHILE @@FETCH_STATUS = 0
 BEGIN

    SELECT @newid =  B.BinId
    FROM @BinIdTable B
        WHERE RowNumber = @count

    UPDATE WebServiceBoxDetails
        SET BinId = @newid
        WHERE Id = @id

    SET @count = @count + 1
    FETCH NEXT FROM MyCursor 
    INTO @id
 END
 CLOSE MyCursor
 DEALLOCATE MyCursor

 IF @RowCount >= @count
 BEGIN

    INSERT INTO WebServiceBoxDetails
    SELECT @BoxNumber, BinId 
        FROM @BinIdTable
        WHERE RowNumber >= @count

 END

それがどうなるか教えてください。

于 2013-03-20T12:32:08.113 に答える
1

これを試して

DECLARE @binIds AS XML = '<Bins><id>7848</id><id>76554</id><id>71875</id></Bins>'
DECLARE @id INT
DECLARE @newid INT
DECLARE @count INT = 1
DECLARE @BinIdTable TABLE(RowNumber INT, BinId INT) 

INSERT @BinIdTable(RowNumber, BinId)
SELECT ROW_NUMBER() OVER(ORDER BY ID), ParamValues.ID.value('.','INT')
FROM
 @binIds.nodes('/Bins/id') AS ParamValues(ID)


DECLARE MyCursor CURSOR FOR
 SELECT id FROM WebServiceBoxDetails WHERE BoxNumber = 12 ORDER BY id

 OPEN MyCursor

 FETCH NEXT FROM MyCursor
 INTO @id

 WHILE @@FETCH_STATUS = 0
 BEGIN

    SELECT @newid =  B.BinId
    FROM @BinIdTable B
        WHERE RowNumber = @count

    UPDATE WebServiceBoxDetails
        SET BinId = @newid
        WHERE Id = @id

    SET @count = @count + 1
    FETCH NEXT FROM MyCursor 
    INTO @id
 END
 CLOSE MyCursor
 DEALLOCATE MyCursor

それがどうなるか教えてください。

于 2013-03-08T03:33:19.710 に答える
1

NODES メソッドを再度使用できます。

UPDATE WebServiceBoxDetails
SET BinID = ParamValues.ID.value('@BinID','VARCHAR(20)')
FROM
 @bindIDs.nodes('/Bins/id') AS ParamValues(ID)
 JOIN WebServiceBoxDetails w ON w.ID = ParamValues.ID.value('@id','VARCHAR(20)')
 WHERE w.BoxNumber = @BoxID
于 2013-03-04T23:58:54.637 に答える