SQL Server:查询名称存储在列中的表的最佳方式是什么?

SQL Server:查询名称存储在列中的表的最佳方式是什么?,sql,sql-server,Sql,Sql Server,我想组合一个查询,但避免使用游标。我们将PDF文件存储在多个表中。每桌一年。因此,我们有如下表名: "Files_2012", "Files_2013", "Files_2014", etc. 然后我们有一个名为Files的主表,它包含文件存储在哪个表中 布局如下: ======================================= FILES ======================================= FileId | RecordId | FileT

我想组合一个查询,但避免使用游标。我们将PDF文件存储在多个表中。每桌一年。因此,我们有如下表名:

"Files_2012", "Files_2013", "Files_2014", etc.  
然后我们有一个名为Files的主表,它包含文件存储在哪个表中

布局如下:

=======================================
 FILES
=======================================
 FileId | RecordId | FileTableName
---------------------------------------
 104    |  7108162 |  Files_2013
 105    |  7108162 |  Files_2014
 106    |  7108162 |  Files_2013
年度表格将如下所示:

=======================================
 FILES_2013
=======================================
 FileId | FileData (varbinary
---------------------------------------
 104    |  0x255044462D312E340A25E2E3CFD30D...
 106    |  0x897444462D312E340A25E2E3CFD30D...

=======================================
 FILES_2014
=======================================
 FileId | FileData (varbinary
---------------------------------------
 105    |  0x556044462D312E340A25E2E3CFD30D...
=======================================
 My returned records
=======================================
 FileId | FileData (varbinary
---------------------------------------
 104    |  0x255044462D312E340A25E2E3CFD30D...
 105    |  0x556044462D312E340A25E2E3CFD30D...
 106    |  0x897444462D312E340A25E2E3CFD30D...
我的查询需要根据RecordId返回记录。因此,在本例中,所有3个Files.RecordId值都相同。我需要返回所有3条记录的FileData列,如下所示:

=======================================
 FILES_2013
=======================================
 FileId | FileData (varbinary
---------------------------------------
 104    |  0x255044462D312E340A25E2E3CFD30D...
 106    |  0x897444462D312E340A25E2E3CFD30D...

=======================================
 FILES_2014
=======================================
 FileId | FileData (varbinary
---------------------------------------
 105    |  0x556044462D312E340A25E2E3CFD30D...
=======================================
 My returned records
=======================================
 FileId | FileData (varbinary
---------------------------------------
 104    |  0x255044462D312E340A25E2E3CFD30D...
 105    |  0x556044462D312E340A25E2E3CFD30D...
 106    |  0x897444462D312E340A25E2E3CFD30D...
我该怎么做?如果有帮助的话,这里是我迄今为止的疑问,尽管我可能还远远不够。我正在将FileTableName值存储到一个临时表中&我希望能够以这种方式使用它们,但在这之后我陷入了困境:

DECLARE @recordId INT

CREATE TABLE #tmpFiles (FileId int, FileTableName varchar(100), FileData varbinary(max))

SET @recordId = 7108162

INSERT INTO #tmpFiles (FileId, FileTableName)
    SELECT FileId, FileTableName 
    FROM dbo.Files 
    WHERE RecordId = @recordId    

UPDATE t
SET t.FileData = f.FileData
FROM #tmpFiles t
INNER JOIN Files_2013 f ON t.FileId = f.FileId

感谢您提供的帮助。

假设您事先知道表名,您可以使用UNION ALL:

如果您不知道表名,我会怀疑,因为它们有共同的名称模式,您需要使用动态SQL,但需要重新考虑不同的选项

阅读

从销售额+@yymm中选择*

这是前一个案例的变体,其中有一套 实际描述同一实体的表。所有的桌子都有相同的颜色 相同的列,并且名称包含一些分区组件, 通常是一年,有时也是一个月。新表将作为 新年/月份开始了

在这种情况下,为每个表编写一个存储过程并不是很简单 可行的并非最不重要,因为用户可能希望指定日期 搜索范围,因此即使每个表有一个过程,您也可以 仍然需要一个动态调度器

现在,让我们非常清楚:这是一个有缺陷的桌子设计。你 每月不应该有一个销售表,您应该有一个 sales表以及表名称中显示的月份应为 联合销售表中主键的第一列。但是你 可能会遇到无法轻松更改的旧版应用程序 桌子的设计。诚然,在某些情况下 分区是有意义的。这个表可能很大,比如说超过10GB 大小,或者您希望能够快速老化旧数据。但在这样的情况下 在这种情况下,您应该正确地进行分区

在下文中,我将介绍三种处理问题的方法 不使用动态SQL的分区

可能的解决办法:

分区表 视图和分区视图 兼容性视图
为什么不只使用一个文件表和一个额外的年份列来弥补其他地方丢失的信息呢?如果要继续使用单独的表,请搜索动态SQL和/或EXECUTE。这是一种执行字符串形式的SQL语句的方法;i、 e.将整个查询放入字符串中,然后执行,而不是将表名从字符串中提取到查询中。由于数据的格式相同,因此将其存储在单独的表中没有多大意义。将所有内容合并到一个表中,为年度添加一列。我同意,以这种方式存储没有多大意义。然而,这些不是我的桌子。它们是我们的母公司多年前建造的&被批准改变其结构的机会微乎其微。