假设我有多个sql表,它们被命名为:
data.PIR_12
data.PIR_13
data.Pir_2455
data.Pir_somedata我能做一些选择吗?
select * from data.PIR% where code = 'mycode'或者它是不可能的,因为模式可能是不同的?
发布于 2020-09-14 16:54:46
我不赞成说“请修正你的数据结构”的评论。请查找数据正常化&在实现这样的东西之前要仔细考虑一下。
只有当你的规模已经很大的时候,你才需要一些接近数据桶的东西。
如果您认为您需要这一点,因为您有不同的数据内容,那么回到规范化,并考虑进一步抽象。你可以得到最抽象的(名称,价值)。
不过,如果您知道结构,并且确信动态表名是答案,那么在sqlserver中您可以构造动态sql。
declare @sql nvarchar(2000), @sometable nvarchar(50), @myid nvarchar(10)
set @sometable='_12'
set @myid = '12'
set @sql = 'select name from data.pir' + @sometable + ' where value='+@myid
exec @sql但是,您可能已经遇到了很多麻烦--这些查询很难处理来自或包装错误处理的结果。
您可以从元数据视图中选择以获取表列表。或者将表列表放入您自己设计的表中。并编写一个迭代器来使用动态sql遍历元数据输出。
动态sql有一些例子,但我认为很久以前就过时了(它们过去的目标是针对复杂临时查询的动态where子句)。
在过去,我使用这些查询进行大量的跨服务器调用(调用相同的sp,只更改servername (&序列化所有调用使循环迭代是最有效的方法)的时间原因)。
发布于 2020-09-14 16:55:40
假设有合理的理由按照表的结构方式构造这些表,并且假定表的列表是固定的,则可以使用联合:
SELECT Column1, Column2, Column3 ... FROM data.PIR_12
UNION SELECT Column1, Column2, Column3 ... FROM data.PIR_13
UNION SELECT Column1, Column2, Column3 ... FROM data.Pir_2455
UNION SELECT Column1, Column2, Column3 ... FROM data.Pir_somedata
WHERE Column3 = 'mycode'注意,我省略了"SELECT *“,这被认为是错误的做法。
https://stackoverflow.com/questions/63879560
复制相似问题