1

最近の復元中に問題が発生しましたが、以前は存在していた可能性があり、存在していなかった可能性がありますが、今ではそれを認識しており、解決策を考え出す任務を負っています. 通常、各行の複数の列名にデータを書き込みますが、すべてのフィールドがオーバーフロー列になることがわかりました。以下は、私たちが持っているものの例です。

データが必要な列:

fldDate - fldName    - fldPhoneNumber - fldTransactionID - fldOverflow    
8/15/13 - John Smith - 1012023344     - 123456789        - Null

私たちが得ているもの:

fldDate - fldName    - fldPhoneNumber - fldTransactionID - fldOverflow   
8/15/13 - null       - null           - null             - fldName="John Smith", fldPhoneNumber="1012023344", fldTransactionID="123456789"

必要なもの:

fldOverflow フィールド データを正しいフィールドに戻す方法を見つける必要があります。どんな助けでも大歓迎です。

4

2 に答える 2

0

fldOverflow の値を xml に変換してから、次のように UPDATE を使用します。

DECLARE @MyTable TABLE(
    fldName          NVARCHAR(50),
    fldPhoneNumber   VARCHAR(20),
    fldTransactionID INT,
    fldOverflow      NVARCHAR(4000)
);
INSERT INTO @MyTable (fldOverflow)
VALUES (N'fldName="John Smith", fldPhoneNumber="1012023344", fldTransactionID="123456789"');

PRINT 'Before:'
SELECT  *
FROM    @MyTable;

-- I would use, also, transactions thus
-- BEGIN TRANSACTION
UPDATE  x
SET     fldName         =z.fldName,
        fldPhoneNumber  =z.fldPhoneNumber,
        fldTransactionID=z.fldTransactionID,
        fldOverflow     =NULL
-- OUTPUT   deleted.fldName AS OldfldName,inserted.fldName AS NewfldName, ...
FROM    @MyTable x
CROSS APPLY
(
    SELECT  y.XmlFragment.value('(/row/@fldName)[1]','NVARCHAR(50)') AS fldName,
            y.XmlFragment.value('(/row/@fldPhoneNumber)[1]','VARCHAR(20)') AS fldPhoneNumber,
            y.XmlFragment.value('(/row/@fldTransactionID)[1]','INT') AS fldTransactionID
    FROM
    (
        SELECT CONVERT(XML,'<row '+REPLACE(x.fldOverflow,',', ' ')+' />') AS XmlFragment
    ) y
) z
WHERE   x.fldOverflow IS NOT NULL;
-- ROLLBACK TRANSACTION
-- -- COMMIT TRANSACTION

PRINT 'After:'
SELECT  *
FROM    @MyTable;

結果:

Before:
fldName     fldPhoneNumber  fldTransactionID fldOverflow
----------- --------------- ---------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NULL        NULL            NULL             fldName="John Smith", fldPhoneNumber="1012023344", fldTransactionID="123456789"

After:
fldName     fldPhoneNumber  fldTransactionID fldOverflow
----------- --------------- ---------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
John Smith  1012023344      123456789        NULL

編集1:

SELECT  x.fldName AS OldfldName,z.fldName AS NewfldName, ...
FROM    @MyTable x
CROSS APPLY
(
    SELECT  y.XmlFragment.value('(/row/@fldName)[1]','NVARCHAR(50)') AS fldName,
            y.XmlFragment.value('(/row/@fldPhoneNumber)[1]','VARCHAR(20)') AS fldPhoneNumber,
            y.XmlFragment.value('(/row/@fldTransactionID)[1]','INT') AS fldTransactionID
    FROM
    (
        SELECT CONVERT(XML,'<row '+REPLACE(x.fldOverflow,',', ' ')+' />') AS XmlFragment
    ) y
) z
WHERE   x.fldOverflow IS NOT NULL;
于 2013-08-15T17:05:30.677 に答える
0

区切られたフィールドを複数の列に分割するための関数が多数あります。これはオプションです。次のCOALESCE()ような文字列操作を使用することもできます。

SELECT  fldDate 
      , fldName = COALESCE(fldName, SUBSTRING(fldOverflow,CHARINDEX('fldName="',fldOverflow)+9,CHARINDEX(', fldPhone',fldOverflow)-CHARINDEX('fldName="',fldOverflow)-10))
      , fldPhoneNumber 
      , fldTransactionID
      , fldOverflow 
FROM Table
于 2013-08-15T16:52:55.430 に答える