从列中的文件路径转换为引用具有文件路径的id号的另一个表

时间:2017-06-29 13:53:17

标签: sql-server database

使用Microsoft SQL Server 2012

我已经尝试了好几个星期来对我的原始问题进行排序,以便让查询正常工作,但确实如此。我想要从中获得的是在旧的问题表中我从数据路径获取数据"文件路径"问题数据从本地计算机上的文件夹引用的列,其结构如下所示:(某些列我没有包括在内)

旧问题表

QuizQuestionID  MasterQuestionID    MasterQuestionGUID                  MasterTypeID    MasterDifficultyID      MasterCategoryID    MasterDecadeID  QuizQuestionTypeID      QuizQuestionDifficultyID        QuizQuestionCategoryID          QuizQuestionDecadeI D   QuestionText                                            AnswerText              FilePath                                        IsEditable  IsDeletable IsDeleted   IsDifficultyOverridden    CreatedDate                   ModifiedDate                AUTO_UseCount    AUTO_TieBreakerUsageCount    AUTO_TieBreakerLastUsed
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1222            1755                0bee472592ce78e7457d87d7a172ff7b    3               2                       7                   3               3                       2                               7                               3                       Name the singer.                                        David Essex             /Sounds/CHORUS David Essex - Tahiti.mp3         False       True        False       False                     2014-01-18 12:53:59.000       2014-02-07 12:28:55.000     0                NULL                         NULL
1223            1756                1df7bd191ef5e31b854c7de5f18982d0    1               2                       11                  NULL            1                       2                               11                              NULL                    What is this savoury item?                              Green Chili             /Images/General/Greeen Chili.png                False       True        False       False                     2014-01-18 15:17:39.000       2014-01-26 19:46:00.000     0                NULL                         NULL

现在在新的问题表中,一列使用另一个名为media2的表来查找这些文件的本地文件路径:

新问题表

id      uuid                                    type    question                        answer          media   created_date                    modified_date                   created_user    modified_user       master_category     master_decade       master_difficulty       is_editable     is_deletable        multiple_choice         choice_1        choice_2        choice_3        choice_4        blur_effect     related     square_1        square_2        square_3        square_4        tie_breaker
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8033    07B3D24A-6FFA-40AF-B723-B78C9899D4B4    Audio   Name the singer.                David Essex     21488   2015-03-23 11:51:31.000         2016-03-08 15:21:48.697         NULL            NULL                7                   2                   1                       False           False               False                   NULL            NULL            NULL            NULL            NULL            NULL        NULL            NULL            NULL            NULL            NULL
17395   48E555BD-52D6-4358-89E5-8FEE0F0F3AFD    Text    What is this savoury item?      Green chili     19459   2013-09-10 23:51:35.460         2013-09-13 12:51:53.963         NULL            NULL                12                  NULL                1                       False           False               NULL                    NULL            NULL            NULL            NULL            NULL            NULL        NULL            NULL            NULL            NULL            NULL

Media2表

id      UUID                                    name                                Path                                                                Mime/type   directory   used for    Category     folder     import folder
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
21488   c25183d2-aad7-4c16-8869-9eac711cc39b    CHORUS David Essex - Tahiti Quiz    C:\media\audio\c25183d2-aad7-4c16-8869-9eac711cc39b.mp3             audio/mp3   Audio       Quiz        Audio        NULL       NULL
19459   642db3c3-c531-4818-9b0d-4d7ccd35e0f9    Green chili                         C:\media\images\642db3c3-c531-4818-9b0d-4d7ccd35e0f9.png            image/png   Images      Quiz        Images       NULL       NULL

只需添加" UUID"其他表是一组随机数字,用于识别文件夹中的文件名,因此我们不会获得任何可能被命名为相同但不具有相同内容但也被其他人使用的重复文件除了测验之外的软件,所以我不能将其用作创建查询的参考。

这是转换"旧问题表"的整个代码。进入"新问题表"子字符串是将格式从旧格式转换为新格式的部分,它可以正常工作,但澄清它会向" media"任何图像或声音问题上的列,它应该将旧表中的文件路径列转换为" media2"表,然后使用" media"将所有行导入新问题表。列引用" media2"文件路径表。

--Specify the database, table and columns we want to insert into
 INSERT INTO NewDatabase.dbo.quizquestions (uuid, [type], question, answer, created_date, modified_date, master_category, master_decade, master_difficulty, is_editable, is_deletable, media)

--Get the data from the old database (old_database) and map the media filename to the media2 table in the new database

select 
   questions.uuid, 
   questions.newtype, 
   questions.QuestionText, 
   questions.AnswerText, 
   questions.CreatedDate, 
   questions.ModifiedDate, 
   questions.master_category, 
   questions.master_decade, 
   questions.master_difficulty,
   questions.IsEditable, 
   questions.IsDeletable, 
   media.id as mediaid from
(
   select NEWID() as uuid, 
   CASE 
          WHEN qqt.TypeName = 'Sound' THEN 'Audio'
          ELSE qqt.TypeName
   END AS newtype,
   qq.QuestionText, qq.AnswerText,  
   CASE 
       WHEN qq.createdDate is not NULL THEN qq.createdDate
          ELSE GETDATE()
   END as createdDate,
   CASE 
          WHEN qq.ModifiedDate is not NULL THEN qq.ModifiedDate
          ELSE GETDATE()
   END as ModifiedDate, 
   CASE

          WHEN cat.id is NOT NULL THEN cat.id
          ELSE 1
   END as master_category,
   qqdc.QuizQuestionDecadeID as master_decade,
   qd.id as master_difficulty,
   qq.IsEditable, qq.IsDeletable,
   qq.FilePath,
   SUBSTRING(
          qq.FilePath, 
          (len(qq.FilePath) - charindex('/', reverse(qq.FilePath)) + 2),
          (len(qq.FilePath) - charindex('.', reverse(qq.FilePath))) - (len(qq.FilePath) - charindex('/', reverse(qq.FilePath))) -1 ) as fpath
  -- (len(qq.FilePath) - charindex('.', reverse(qq.FilePath)) as positionoflastdot),
   --(len(qq.FilePath) - charindex('/', reverse(qq.FilePath)) as positionoflastslash),
   from Olddatabase.dbo.QuizQuestion qq
   left join Olddatabase.dbo.QuizQuestionType qqt on qq.QuizQuestionTypeID = qqt.QuizQuestionTypeID
   left join Olddatabase.dbo.QuizQuestionDifficulty qqd on qq.QuizQuestionDifficultyID = qqd.QuizQuestionDifficultyID
   left join Olddatabase.dbo.QuizQuestionCategory qqc on qq.QuizQuestionCategoryID = qqc.QuizQuestionCategoryID
   left join Olddatabase.dbo.QuizQuestionDecade qqdc on qq.QuizQuestionDecadeID = qqdc.QuizQuestionDecadeID
   left join Olddatabase.dbo.QuizQuestionCategory qqmc on qq.MasterCategoryID = qqmc.MasterQuestionCategoryID
   left join Newdatabase.dbo.QuizCategories cat on qqc.CategoryName = cat.name
   left join Newdatabase.dbo.QuizDifficulties qd on qd.id = qq.MasterDifficultyID
   where qq.MasterCategoryID is not null
   ) as questions
left join Newdatabase.dbo.Media2 media on media.name = replace(fpath, 'quiz','')

由于软件非常依赖它,因此无法真正改变表的结构,并且手动更改它会非常痛苦和耗时,因为有超过2000个音频/图像问题

我只是围绕SQL数据库和查询,但这已经让我无法继续前进。

任何改变上述查询或创建完全不同的内容的帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

只要看一下,代码看起来结构合理。面对这样的事情,我将查询“减少”到只有相关的部分,并从那里进行调试,抛出额外的行,就像你现在已注释掉的那些,以查看返回的函数调用的部分。选择它的一部分,看看所有的细节,你最终会弄清楚什么没有排队。以下内容应作为初始"最小查询":

select 
   qquestions.FilePath
  ,questions.fpath
  ,media.id as mediaid
 from (--  Build the necessary filepath.  Running just the subquery can help figure things out too
       select
         qq.FilePath
        ,SUBSTRING(
              qq.FilePath
             ,(len(qq.FilePath) - charindex('/', reverse(qq.FilePath)) + 2)
             ,(len(qq.FilePath) - charindex('.', reverse(qq.FilePath))) - (len(qq.FilePath) - charindex('/', reverse(qq.FilePath))) -1 ) as fpath
       from Olddatabase.dbo.QuizQuestion qq
       where qq.MasterCategoryID is not null
   ) as questions
left join Newdatabase.dbo.Media2 media
  on media.name = replace(fpath, 'quiz','')

与此相关,应该更容易搞清楚事情。

奖金建议:代码如

CASE 
   WHEN qq.createdDate is not NULL THEN qq.createdDate
      ELSE GETDATE()
END as createdDate,

可以用更短更易读的形式替换

isnull(qq.createdDate, getdate())  createdDate,