【问题标题】:SQL Server : find and update column in Table 1 with Information from Table 2SQL Server:使用表 2 中的信息查找和更新表 1 中的列
【发布时间】:2012-10-20 05:07:05
【问题描述】:

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

  • Table1Column1
  • Table2Column2

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

我要做的是用Table2 查询Table1 并匹配文件名,在本例中为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 中的内容。这只是我实验室的一个测试,看看它是否会起作用,我什至还没有开始研究如何在两个不同的表之间匹配字符串的一部分。

【问题讨论】:

  • 是否要从 Column2 的路径中提取 video1 以匹配 Table1 中存在的记录? Table1 记录是否已经存在?在将其放入 sql 之前将该名称提取到另一个字段中,然后关闭该字段呢?
  • 大卫,我添加了更多信息。希望它有所帮助。就像我说的那样,我对这一切都很陌生,并且正在努力学习。
  • 您的示例中 UPDATE 的问题是您将 Column2 'server2/folder/video1.mpg' 中的完整路径与部分路径(如 '%' + Table1.Column1 + '%')进行比较在第 1 列。除非您先提取文件名或 Column2 中的完整路径存在于 Column1 中,否则这些将永远不会匹配。请参阅下面的示例以获取可能的解决方案。
  • 您需要在加载到 SQL 之前或之后提取文件名(如果您要匹配记录)。

标签: sql-server powershell scripting


【解决方案1】:

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

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

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',''))

Table1 中的起始值

现在,我使用 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 中的完整路径

【讨论】:

  • +1 :将特定数据提取到它自己的派生字段中当然是要走的路。它集中了代码并简化了查询,它缓存结果而不是重复计算,它支持索引使用等等。
  • 我从昨天开始就一直在尝试让它工作,可能我是新手,但我无法弄清楚为什么会出现这个错误:Msg 102, Level 15, State 1,第 1 行 '(' 附近的语法不正确。消息 102,级别 15,状态 1,第 2 行 '(' 附近的语法不正确。
  • 发布您的代码。这表明您在语句中输入了错误的内容。
  • 大卫,感谢您的帮助!我想到了。这极大地帮助了我前进。
  • 请确保将其标记为已回答(复选标记),以便其他人知道哪个解决方案有帮助。
【解决方案2】:

这是一个考虑文件路径变化的非常丑陋的查询,并且可能没有优化,但是一次性运行并在一个脚本中获取所有内容:

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 
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2013-01-20
    • 2016-01-23
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    相关资源
    最近更新 更多