Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Iteruj przez zmienną XML w SQL Server

Coś takiego?

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)

Aktualizacja: jeśli musisz użyj starej starszej procedury składowanej i nie mogę jej zmienić (byłby to mój preferowany sposób robienia tego), wtedy musiałbyś samodzielnie wykonać pętlę wiersz po wierszu (RBAR), np. za pomocą zmiennej tabeli:

-- 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak usunąć nadmiarową przestrzeń nazw w zagnieżdżonej kwerendzie podczas korzystania z FOR XML PATH?

  2. Optymalnie wydajne zapytanie dla najnowszego rekordu dla każdego N

  3. Zapytanie przy użyciu tabeli pochodnej z ISNUMERIC powoduje niepowodzenie konwersji (varchar na int)

  4. Zmień typy kolumn w ogromnej tabeli

  5. Jak zwrócić wszystkie niezaufane ograniczenia kluczy obcych w programie SQL Server (przykład T-SQL)