sql >> Database teknologi >  >> RDS >> Sqlserver

Gentag gennem XML-variabel i SQL Server

Sådan noget?

DECLARE @XmlVariable XML = '<parent_node>
                              <category>Low</category>
                              <category>Medium</category>
                              <category>High</category>
                            </parent_node>'

INSERT INTO dbo.YourTargetTable(CategoryColumn)
  SELECT 
     XTbl.Cats.value('.', 'varchar(50)')
  FROM 
     @XmlVariable.nodes('/parent_node/category') AS XTbl(Cats)
 

Opdatering: hvis du skal bruge den gamle legacy lagrede procedure og ikke kan ændre den (det ville være min foretrukne måde at gøre dette på), så skulle du selv lave en række-for-lidende-række (RBAR), f.eks. ved at bruge en tabelvariabel:

-- declare temporary work table DECLARE @RbarTable TABLE (CategoryName VARCHAR(50)) -- insert values into temporary work table INSERT INTO @RbarTable(CategoryName) SELECT XTbl.Cats.value('.', 'varchar(50)') FROM @XmlVariable.nodes('/parent_node/category') AS XTbl(Cats) -- declare a single category DECLARE @CategoryNameToBeInserted VARCHAR(50) -- get the first category SELECT TOP 1 @CategoryNameToBeInserted = CategoryName FROM @RbarTable -- as long as we have data WHILE @CategoryNameToBeInserted IS NOT NULL BEGIN -- execute your stored procedure here..... EXEC sp_executesql N'dbo.YourStoredProcedure @CategoryName', N'@CategoryName VARCHAR(50)', @CategoryName = @CategoryNameToBeInserted -- delete the category we just inserted from the temporary work table DELETE FROM @RbarTable WHERE CategoryName = @CategoryNameToBeInserted -- see if we still have more categories to insert SET @CategoryNameToBeInserted = NULL SELECT TOP 1 @CategoryNameToBeInserted = CategoryName FROM @RbarTable ORDER BY CategoryName END

  1. Drej på Oracle 10g

  2. SQL Server 2008 - adskillende adressefelt

  3. Manipulering af samlinger

  4. Hvad svarer til LOCK_ESCALATION =TABLE i SQL Server 2005?