使用列

时间:2016-03-12 21:07:51

标签: sql sql-server loops stored-procedures

您好我正在尝试创建一个循环遍历我的sql server中的表的查询,但问题是我需要通过表的其中一列的某个部分来过滤查询。例如,表格的字段(以及示例值)如下所示(表格名称位于顶部,值正好位于下方):

 PDID      PDDescription      PDFilename      PDDocumentLocation PDDocumentTypeID  
 77234     PDF for FRT       FRT_154327      PD Documents\154487      11 

问题是我需要按PDDocumentlocation的数字部分进行过滤,就像我有一组PD数字一样,这些数字与" PD Documents \ ####"相关联。本节 - > ###,有没有办法创建一个循环查询,根据列的一部分提取这些值?如果可能的话,我可以在SQL中引用文件夹位置吗?对于PDDocumentLocation,如果有帮助,它将始终以PD文档开头。 谢谢!我试过谷歌搜索迭代表,但我无法找到任何基于参数的迭代,如数字列表和引用列的艺术。非常感谢任何帮助。

例如,如果我有一个PD编号列表,如12456,13788,23456,那么我希望查询返回所有具有这些编号的行,这些编号来自列" PDDocumentLocation"并且该列中的所有值都以“PD文档”开头。数字列表对应如下:PD Documents \ 12456,PD Documents \ 13788,PD Documents \ 23456

1 个答案:

答案 0 :(得分:0)

你知道前缀(常量根文件夹)和后缀(数字列表),位置模式是不可变的。而不是使用更简单的方式解析 - 将根文件夹添加到给定的数字并获取完整的位置名称。您不需要提取列的一部分""因为您知道此列的完整值。

GO
declare @RootFolder varchar(1000) = 'PD Documents\'

declare @FileFolders table
(
  PDName varchar(1000)
)

declare @PDDocumentLocation table
(
  PDDocumentLocation varchar(1000)
)

/* incoming list  */
insert into @FileFolders(PDName)
values ('12456'), ('13788'), ('23456')


/* stored data */
insert into @PDDocumentLocation(PDDocumentLocation)
values 
  ('PD Documents\154487'), 
  ('PD Documents\12456'), 
  ('PD Documents\13788'), 
  ('PD Documents\13788_'), 
  ('PD Documents\17211')

/* preparing filter */
update f set
  PDName = @RootFolder + f.PDName
from @FileFolders f

select d.*
from @PDDocumentlocation d
where exists
  (
    select 1 from @FileFolders ff 
    where ff.PDName = d.PDDocumentLocation
  ) 
order by d.PDDocumentLocation
GO

并使用光标或您需要的任何内容遍历文件。