Сохраните строку Excel в столбце SQL Server (тип данных XML). Как мне обновить определенное значение ячейки? - PullRequest
1 голос
/ 22 января 2011

У меня есть строка данных Excel (т.е. несколько ячеек из таблицы Excel), сохраненная в таблице SQL Server в столбце с типом данных XML.

Мне нужно обновить значение в конкретной ячейке в этих данных, сохраненных в столбце XML, на новое значение, которое хранится в другом столбце в той же таблице. Как мне это сделать?

Я не могу даже выбрать правильную ячейку, используя метод XMLColumnName.Query () в T-SQL SQL Server 2005.

Вставка примера таблицы с примерами строк здесь, так что вы можете поэкспериментировать и сообщить мне, если вы смогли понять это! Спасибо !!

-Shiva

    -- reference article for XML data manipulation 
-- http://msdn.microsoft.com/en-us/library/ms345117(v=sql.90).aspx#sql2k5xml_topic3

  -- create test table for xml data 
CREATE TABLE testdocs (pk INT PRIMARY KEY, xCol XML not null)

  -- insert 1 row of test data
insert into testdocs values(1,'<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
  xmlns:o="urn:schemas-microsoft-com:office:office" 
  xmlns:x="urn:schemas-microsoft-com:office:excel" 
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
  xmlns:html="http://www.w3.org/TR/REC-html40">
  <Worksheet ss:Name="TestSheet">
    <Table ss:ExpandedColumnCount="509" ss:ExpandedRowCount="1" ss:StyleID="s191">
      <Column ss:StyleID="s1" ss:AutoFitWidth="0" ss:Width="55" />
      <Column ss:StyleID="s2" ss:AutoFitWidth="0" ss:Width="55" />
      <Row>
        <Cell>
          <Data ss:Type="String">TestValue1</Data>
        </Cell>        
        <Cell>
          <Data ss:Type="String">TestValue2</Data>
        </Cell>
      </Row>
    </Table>
  </Worksheet>
</Workbook>')

  -- select records, and inspect the XML in SSMS
select * from testdocs

-- want to replace / update "TestValue2" in the XML for the 1s rows, to "New TestValue2"
-- location in XML hierarchy is as follows

    /Workbook/Worksheet/Table/Row/Cell/Data

-- how do i do that ?

1 Ответ

1 голос
/ 22 января 2011

Необходимо правильно получить пространства имен XML:

with xmlnamespaces (
    DEFAULT 'urn:schemas-microsoft-com:office:spreadsheet'
    , 'urn:schemas-microsoft-com:office:office' as o
    , 'urn:schemas-microsoft-com:office:excel' as x
    , 'urn:schemas-microsoft-com:office:spreadsheet' as ss
    , 'http://www.w3.org/TR/REC-html40' as html)
select xCol.value ('(/Workbook/Worksheet/Table/Row/Cell/Data)[1]','varchar(100)') as Data
from testdocs

Обновление:

with xmlnamespaces (
    DEFAULT 'urn:schemas-microsoft-com:office:spreadsheet'
    , 'urn:schemas-microsoft-com:office:office' as o
    , 'urn:schemas-microsoft-com:office:excel' as x
    , 'urn:schemas-microsoft-com:office:spreadsheet' as ss
    , 'http://www.w3.org/TR/REC-html40' as html)
update testdocs
set xCol.modify (' replace value of (/Workbook/Worksheet/Table/Row/Cell/Data/text())[1]
    with "ReplacedValue1"');

select  * from testdocs
...