CREATE TABLE t1 (
id int,
name varchar(50),
PRIMARY KEY (id)
);
insert into t1 (id,name) values(1,'t1.1')
insert into t1 (id,name) values(2,'t1.2')
insert into t1 (id,name) values(3,'t1.3')
CREATE TABLE t2 (
id int,
name varchar(50),
PRIMARY KEY (id),
CONSTRAINT fk_t1_t2 FOREIGN KEY (Id) REFERENCES t1(Id)
);
insert into t2 (id,name) values(1,'t2.1')
insert into t2 (id,name) values(2,'t2.2')
insert into t2 (id,name) values(3,'t2.3')
-- SQL created manualy:
select * from t1
join t2 on t2.id = t1.id
drop table t2
drop table t1
这是一个非常简单的例子。考虑一个包含大量外键引用的巨型数据库结构!
手动定义所有连接条件是一项艰巨的任务!
我想动态创建这个SQL语句!
外部引用已在数据库中定义,但在哪里?
脚本应该这样:
select
t1.id,
t1.name,
t2.id,
it2.name
from t1
join t2 on t2.id = t1.id
有人已经解决了这个问题吗?
附录:脚本的参数是第一个Tablename和最后一个Tablename。这两个表应与所有相关的表间或参考表连接在一起。
这样就可以了,但我不建议像这样做。
问题:更频繁地引用同一个表(别名),加入类型(内部,左侧,......),所选列列表......
DECLARE @table AS VARCHAR(100)='YouTableName';
WITH AllColumns AS
(
SELECT pObj.name AS ParentTable
,pCol.COLUMN_NAME AS ParentColumn
,fkObj.name AS ReferecedTable
,fkCol.COLUMN_NAME AS ReferencedColumn
FROM sys.foreign_key_columns AS fkc
INNER JOIN sys.objects AS pObj ON pObj.object_id=fkc.parent_object_id
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS pCol ON pCol.TABLE_NAME=pObj.name AND pCol.ORDINAL_POSITION=fkc.parent_column_id
INNER JOIN sys.objects AS fkObj ON fkObj.object_id=fkc.referenced_object_id
INNER JOIN INFORMATION_SCHEMA.COLUMNS AS fkCol ON fkCol.TABLE_NAME=fkObj.name AND fkCol.ORDINAL_POSITION=fkc.referenced_column_id
WHERE fkc.constraint_object_id IN
(
SELECT object_id FROM sys.objects AS o
WHERE o.name IN
(
SELECT tc.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
WHERE tc.CONSTRAINT_TYPE='FOREIGN KEY'
AND tc.TABLE_NAME=@table
)
)
)
SELECT 'SELECT *
FROM ' + @table +
(
SELECT ' INNER JOIN ' + ac.ReferecedTable + ' ON ' + ac.ParentTable + '.' + ac.ParentColumn + '=' + ac.ReferecedTable + '.' + ac.ReferencedColumn + CHAR(10)
FROM AllColumns AS ac
FOR XML PATH('')
)
来自Shnugo的精彩剧本。但它有一些缺点:
dbo
架构中的表我改进这个脚本来解决这个问题:
PRINT