SQL Server:使用表2中的信息查找和更新表1中的列

时间:2012-10-30 19:15:34

标签: sql-server powershell scripting

我是所有这一切的新手,并且刚开始编写脚本/编程。我搜索过高低,尝试了几件事,但我没有成功。我想做什么

  • Table1Column1
  • Table2Column2

在这些列中是文件路径。 Column1文件路径为\\\server1\folder\video1.aviColumn2文件路径为http://server2/folder/video1.mpg

我要做的是使用Table1查询Table2并匹配文件名,在本例中为video1。此文件名将始终不同,因此需要一些东西,以便它自己找到字符串的一部分。匹配完成后,我需要Table1更新Column1,以使其与Table2.Column2中的内容完全匹配。如果已完成更改并且我的程序的其余部分已完成运行,Table2中的所有数据都将被删除,但我仍需要永久更改Table1.Column1并且不会还原为旧文件路径。

提前感谢您的帮助!

编辑:

以下是我们数据库的文件名:

5149__20121030_120839.avi将转换为5149__20121030_120839.mpg 在任何给定的时间点,文件名的开头将在5100到5999之间,其余部分将随机变化。我目前如何设置:

我正在抓取文件名并将其保存到csv文件中。从那里我将这个csv文件上传到Table2.Column2。正是在这个时候,我一直在查询部分文件路径以找到Table1.Column1中的匹配项。找到一个匹配项我正在尝试更新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 个答案:

答案 0 :(得分:3)

您没有提供足够的信息来了解两个表中路径和文件扩展名的变化,但假设它们是常量,您可以执行以下操作:

首先我设置一些模拟表并输入值

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中启动值

enter image description here

现在,我使用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

中的完整路径

enter image description here

答案 1 :(得分:0)

考虑文件路径变化这是一个非常丑陋的查询,可能无法进行优化,但是对于一次性运行并在一个脚本中完成所有操作:

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 
        )