2

MS SQL 2008R2Standardデータベースがあります。varchar(250)データを含む列と。を含む列がありxmlます。

CREATE TABLE [dbo].[art](
[id] [int] IDENTITY(1,1) NOT NULL,
[idstr] [varchar](250) NULL,
[rest] [xml] NOT NULL,
    CONSTRAINT [PK_art] PRIMARY KEY CLUSTERED ([id] ASC)
)

問題は、文字列関数の結果をxmlの約140レコードに挿入したいということです。xml.modify動的に生成されたテキストで使用しようとしました。

UPDATE [pwi_new].[dbo].[art]
SET rest.modify('insert <e><k>link</k><v>' 
      + my_string_function(idstr) + '</v></e> into (/root)[1]')
  WHERE parent = 160
  AND idstr LIKE '%&%'
GO

ただし、次のエラーが発生します。

The argument 1 of the XML data type method "modify" must be a string literal.

何か案は?時間フィールド、外部言語の使用、および生成された文字列からのTSQLの実行を避けたいですか?(とについて聞いたことがsql:variableありsql:columnますが、これはtsql関数の結果です。)

4

2 に答える 2

7

ここで何をしたいのかわからない。TSQL関数について言及しましたが、それがreplace&to&である場合は必要ありません。それはあなたのためにSQLServerによって処理されます。

テーブル変数を使用したテスト@art

declare @art table(parent int, idstr varchar(250), rest xml)

insert into @art values
(160, '123&456', '<root></root>')

update @art 
set rest.modify('insert (<e><k>link</k><v>{sql:column("idstr")}</v></e>) into (/root)[1]') 
where parent = 160 and
      idstr like '%&%'

select rest
from @art 

結果:

<root>
  <e>
    <k>link</k>
    <v>123&amp;456</v>
  </e>
</root>

アップデート

それほど些細な状況ではない場合は、クロスアプライを使用して必要な値を列に取得できます。

declare @art table(parent int, idstr varchar(250), rest xml)

insert into @art values
(160, '123&456', '<root></root>')

update a
set rest.modify('insert (<e><k>link</k><v>{sql:column("T.X")}</v></e>) into (/root)[1]') 
from @art as a
  cross apply (select reverse(replace(idstr, '2', '8')+'NotSoTrivial')) as T(X)
where parent = 160 and
      idstr like '%&%'

select rest
from @art 

結果:

<root>
  <e>
    <k>link</k>
    <v>laivirToStoN654&amp;381</v>
  </e>
</root>
于 2011-09-22T12:58:07.330 に答える
1

テーブルにキーがあると仮定します。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += CHAR(13) + CHAR(10) + 'UPDATE [pwi_new].[dbo].[art] '
    + ' SET rest.modify(''insert <e><k>link</k><v>' 
    + REPLACE(idstr,'&','&amp;') 
    + '</v></e> into (/root)[1]'') WHERE key_column = ' 
    + CONVERT(VARCHAR(12), key_column) + ';'
FROM [pwi_new].[dbo].[art]
  WHERE parent = 160
  AND idstr LIKE '%&%';

PRINT @sql;
--EXEC sp_executesql @sql;
于 2011-09-22T12:50:40.987 に答える