在这个包含数百个表的旧SQL数据库中,我需要对名称遵循以下格式的所有表进行内部联接:
barX_foo_bazX
barX_foo_bazY
barZ_foo_bazZ
我不确定这是否可行。
显然,使用这种语法并不是(但它可能有助于理解我的目标):
USE [LegacyDB_Name]
SELECT *
FROM '%_foo_%' inner join '%_foo_%'
where my_stuff_is(some condition)
有什么建议吗?关于我如何做到这一点的想法?也许这个年轻的padawan没有看到更容易的路径......
非常感谢!
答案 0 :(得分:2)
我不确定这是否可行。
不,表名不能包含或使用通配符,它们必须是字符串。
我的建议是找到制作这些选择查询的程序,并在那里的查询中包含您需要的任何模式匹配。
但是您完成的查询必须包含表名作为字符串。
答案 1 :(得分:1)
也许最简单的方法是根据以下查询声明游标并构建动态sql查询。研究tsql游标和动态sql执行它应该相当简单。
SELECT *
FROM information_schema.tables
Where Table_Type = 'Base Table' And Table_Name Like '%_foo_%'
答案 2 :(得分:1)
如果你的表都具有相同的结构(即列),那么你可以分两步完成。
生成SQL语句:
select 'UNION ALL SELECT ''' + table_name + ''' AS table_name, * FROM '
+ table_name AS stmt
from information_schema.tables
where table_type = 'BASE TABLE'
and table_catalog = 'LegacyDB_Name'
and table_name LIKE '%foo%';
输出类似于:
stmt
--------------------------------------------------------------------
UNION ALL SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX
UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY
UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ
从此输出中,复制SQL行并从第一行中删除前两个单词(UNION ALL
)。这是一个有效的SQL语句。
执行上面派生的SQL语句
如果您更频繁地需要此SQL,请为其创建一个视图:
CREATE OR REPLACE VIEW all_foo AS
SELECT 'barX_foo_bazX' AS table_name, * FROM barX_foo_bazX
UNION ALL SELECT 'barX_foo_bazY' AS table_name, * FROM barX_foo_bazY
UNION ALL SELECT 'barX_foo_bazZ' AS table_name, * FROM barX_foo_bazZ;
现在您可以查询
SELECT * FROM all_foo WHERE ...