1

私はこれらすべてに不慣れで、一般的にスクリプト/プログラミングを始めたばかりです。私は高低を検索し、いくつかのことを試しましたが、成功しませんでした。私がやろうとしていること

  • Table1もっているColumn1
  • Table2もっているColumn2

これらの列内にはファイルパスがあります。Column1ファイルパスは\\\server1\folder\video1.aviColumn2ファイルパスはhttp://server2/folder/video1.mpg

私がやろうとしているのは、ファイルの名前(この場合は)でクエリTable1を実行して一致させることです。このファイル名は常に異なるため、文字列の一部を単独で検出するために何かが必要になります。一致したら、にあるものと完全に一致するように更新する必要があります。変更が行われ、プログラムの残りの部分の実行が終了すると、のすべてのデータが削除されますが、それでも永続的に変更する必要があり、古いファイルパスに戻さないでください。Table2video1Table1Column1Table2.Column2Table2Table1.Column1

助けてくれてありがとう!

編集:

データベースのファイル名は次のとおりです。

5149__20121030_120839.aviに変換されます。これは5149__20121030_120839.mpgに変換されます。任意の時点で、ファイル名の先頭は5100から5999の範囲になり、残りはランダムに変更されます。現在どのように設定していますか:

ファイル名を取得してcsvファイルに保存しています。そこから、このcsvファイルをにアップロードしていますTable2.Column2。この時点で、ファイルパスの一部をクエリして、で一致するものを見つけることに固執していますTable1.Column1。一致するものが1つ見つかりました。文字列全体を更新して、にあるTable1.Column1ものと一致させようとしていTable2.Column2ます。すべてのことを言い終えたらTable2.Column2、移動したファイルをすべて削除し、翌日からやり直します。

私はあちこちを検索して、試すべきことがいくつか見つかりましたが、まだ運がありません。私が来た最も近いものはこれです:

UPDATE Table1 SET Table1.Column1 = Table2.Column2 FROM Table1 FULL JOIN Table2 ON Table2.Column2 like '%' + Table1.Column1 + '%'

ただし、これを実行するときは常に、にTable1.Column1あるものを置き換えるのではなく、すべてをNULLに設定しますTable2.Column2。これは、それが機能するかどうかを確認するための私のラボでの単なるテストであり、2つの異なるテーブル間で文字列の一部を一致させる方法についてはまだ調査を開始していませんでした。

4

2 に答える 2

3

2つのテーブルのパスとファイル拡張子にどの程度の変動があるかを知るのに十分な情報を提供していませんが、それらが一定であると仮定すると、次のようなことができます。

まず、いくつかの模擬テーブルを設定して値を入力します

DECLARE @Table1 TABLE(Column1 varchar(200),keyfield varchar(50))
DECLARE @Table2 TABLE(Column2 varchar(200),keyfield varchar(50))

INSERT INTO @Table1
SELECT '\\\server1\folder\video1.avi',''
UNION ALL
SELECT '\\\server1\folder\video27.avi',''

INSERT INTO @Table2
SELECT 'http://server2/folder/video1.mpg',''
UNION ALL
SELECT 'http://server2/folder/video27.mpg',''

次に、これを機能させるために必要になる可能性があるように、テーブルを更新します。

UPDATE @Table1 SET keyfield=(REPLACE(REPLACE(Column1,'\\\server1\folder\',''),'.avi',''))
UPDATE @Table2 SET keyfield=(REPLACE(REPLACE(Column2,'http://server2/folder/',''),'.mpg',''))

表1の開始値

ここに画像の説明を入力してください

ここで、keyFieldを使用して値を変更し、テーブルをリンクします

UPDATE t1
SET t1.Column1=t2.Column2
FROM @Table1 t1 INNER JOIN @Table2 t2 ON t1.keyfield=t2.keyfield

SELECT * FROM @Table1

@Table1に@Table2にあったフルパスがあることがわかります

ここに画像の説明を入力してください

于 2012-10-30T19:35:27.997 に答える
0

これは、ファイルパスのバリエーションを検討するための非常に醜いクエリであり、最適化されていない可能性がありますが、1回限りの実行で、すべてを1つのスクリプトで取得します。

UPDATE Table1 
SET Table1.Column1 = Table2.Column2 
FROM Table1 
INNER JOIN Table2 
    ON substring(Table2.Column2, 
                len(Table2.Column2) - CASE charindex('\', reverse(rtrim(Table2.Column2))) WHEN 0 THEN charindex('/', reverse(rtrim(Table2.Column2))) ELSE charindex('\', reverse(rtrim(Table2.Column2))) END + 2, 
                charindex('.', Table2.Column2) - len(Table2.Column2) + CASE charindex('\', reverse(rtrim(Table2.Column2))) WHEN 0 THEN charindex('/', reverse(rtrim(Table2.Column2))) ELSE charindex('\', reverse(rtrim(Table2.Column2))) END - 2 
        )
        = 
        substring(Table1.Column1, 
                len(Table1.Column1) - CASE charindex('\', reverse(rtrim(Table1.Column1))) WHEN 0 THEN charindex('/', reverse(rtrim(Table1.Column1))) ELSE charindex('\', reverse(rtrim(Table1.Column1))) END + 2, 
                charindex('.', Table1.Column1) - len(Table1.Column1) +CASE charindex('\', reverse(rtrim(Table1.Column1))) WHEN 0 THEN charindex('/', reverse(rtrim(Table1.Column1))) ELSE charindex('\', reverse(rtrim(Table1.Column1))) END - 2 
        )
于 2012-10-30T20:15:05.967 に答える