2017-08-22 12 views
0

私はXMLテンプレートを持っていますxp_sprintfを使用してテーブルの行値に基づいてXMLを構築する必要があります。さらに、表にはInt値とBit値があります。intプレースホルダ%d in xp_sprintf - SQL Server

表スキーマ:StudentMark

CREATE TABLE [dbo].[StudentMark] 
(
    [StudentMarkId] [int] IDENTITY(1,1) NOT NULL, 
    [StudentId] [uniqueidentifier] NOT NULL, 
    [SubjectId] [uniqueidentifier] NOT NULL, 
    [Score] [int] NOT NULL, 
    [ScoreInfo] [xml] NOT NULL, 
    [GeneratedOn] [datetime2](2) NOT NULL, 
    [IsPass] [bit] NOT NULL, 
    CONSTRAINT [PK_StudentMark] 
     PRIMARY KEY CLUSTERED ([StudentMarkId] ASC) 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

サンプル種データ

INSERT INTO [dbo].[StudentMark] ([StudentId], [SubjectId], [ScoreInfo], GeneratedOn], [Score], [IsPass]) 
VALUES ('FC3CB475-B480-4129-9190-6DE880E2D581', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:10:15', 95, 1), 
     ('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', '0D72F79E-FB48-4D3E-9906-B78A9D105081', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-10 10:10:15', 100, 1), 
     ('0F4EF48C-93E3-41AA-8295-F6B0E8D8C3A2', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20', 25, 0), 
     ('FC3CB475-B480-4129-9190-6DE880E2D581', 'AB172272-D2E9-49E1-8040-6117BB6743DB', '<StudentMarkAttribute xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></StudentMarkAttribute>', '2017-08-16 09:06:20', 82, 1); 

要件:私は、次のXMLとして行を変換し、適切なレコードの中で更新する必要がありますする必要があります列[dbo].[StudentMark].[ScoreInfo]

XMLテンプレート

<ScoreInfo> 
    <StudentMarkId>%d</StudentMarkId> 
    <StudentId>%s</StudentId> 
    <SubjectId>%s</SubjectId> 
    <Score>%d</Score> 
    <GeneratedOn>%s</GeneratedOn> 
    <IsPass>%d</IsPass> 
</ScoreInfo> 

私は、次のエラーメッセージ

エラーを取得していますStackOverflowの質問

declare @name varchar(150) 
set @name = 'John' 

declare @score int 
set @score = 75 

DECLARE @ret varchar(500) 
exec master..xp_sprintf @ret OUTPUT, 'Hello %s, your score is %d', @name, @score 

PRINT @ret 

のいずれかから、次のサンプルコードを試してみました拡張ストアドプロシージャを実行しています:無効なパラメータの種類メッセージ 50003、レベル1、状態0

が親切にどのように指定したテーブル[dbo].[StudentMark]

でテンプレートXMLを構築するために私を助ける私はreffered、次の質問

私はどのように数値の書式指定子を使用する方法など

+0

なぜxp_sprintfを使用しますか? –

+0

これに代わる機能はありますか?はいの場合は私を助けてください... –

+0

[FOR XML(SQL Server)](https://docs.microsoft.com/en-us/sql/relational-databases/xml/for-xml-sql)から始めてください。 -server) –

答えて

2

xp_sprintf only supports string arguments and %s placeholders、SQL Serverで%dプレースホルダを使用する方法はありません。数値を文字列にキャストし、それを使って%sプレースホルダに入力する必要があります。

要件を満たす最も簡単な方法は、組み込みのXML機能を使用することです。単一のクエリでは、すべての行について

<ScoreInfo> 
    <StudentMarkId>%d</StudentMarkId> 
    <StudentId>%s</StudentId> 
    <SubjectId>%s</SubjectId> 
    <Score>%d</Score> 
    <GeneratedOn>%s</GeneratedOn> 
    <IsPass>%d</IsPass> 
</ScoreInfo> 

update [target] 
    SET [ScoreInfo] = [XmlValue] 
    FROM [dbo].[StudentMark] AS target 
    JOIN (
      SELECT [StudentMarkId], 
       (
        SELECT 
         [StudentMarkId],[StudentId], [SubjectId], [GeneratedOn], [Score], [IsPass] 
        FROM [dbo].[StudentMark] AS innr 
        WHERE outr.[StudentMarkId] = innr.[StudentMarkId] 
        FOR XML PATH('ScoreInfo'), TYPE 
       ) as [XmlValue] 
      FROM [dbo].[StudentMark] AS outr 
     ) AS source 
    ON target.[StudentMarkId] = source.[StudentMarkId] 

はにScoreInfoが等しくなるように設定します。

+0

私の要件の部分的な答えですが、私の質問は 'xp_sprintf'で'%d'を使う方法です。 –