Я признаю, что это супер уродливое и, вероятно, требуется намного больше работы, но оно основано на генерации базовых запросов на основе отношений PK/FK. Вероятно, вы должны изменить внутреннее соединение влево, если в любой из таблиц FK могут отсутствовать соответствующие записи PK.
declare @table varchar(50);
set @table = 'Users';
declare @pk_table varchar(50);
declare @fk_table varchar(50);
declare @pk_column varchar(50);
declare @fk_column varchar(50);
declare @curr_table varchar(50);
set @curr_table = '';
declare @sql varchar(8000);
set @sql = 'select top 200 * from ' + @table + char(10)
DECLARE table_cursor CURSOR FOR
SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME--,
--Constraint_Name = C.CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT
i1.TABLE_NAME,
i2.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE
i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
ON PT.TABLE_NAME = PK.TABLE_NAME
where PK.TABLE_NAME = @table
OPEN table_cursor
FETCH NEXT FROM table_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column
WHILE @@FETCH_STATUS = 0
BEGIN
if @curr_table <> @fk_table
begin
-- create join
set @sql = @sql + ' inner join ' + @fk_table + char(10)
set @sql = @sql + ' on ' + @pk_table + '.' + @pk_column + ' = ' + @fk_table + '.' + @fk_column + char(10)
end
else
begin
-- create join on fields
set @sql = @sql + ' and ' + @pk_table + '.' + @pk_column + ' = ' + @fk_table + '.' + @fk_column + char(10)
end
FETCH NEXT FROM table_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column
END
CLOSE table_cursor
DEALLOCATE table_cursor
print @sql
Можем ли мы привести пример? 1 пользователь, с какими столбцами он должен получить из связанных таблиц – phadaphunk
У меня есть таблицы, такие как Users, UserPictures, UserMessages, UserAddresses и т. Д. У меня бы возник вопрос, например, «select top 200 * из связанных со стороны пользователей» связанных таблиц **, где userid = 1 ", но в разделе" все связанные таблицы "будет динамически. Не печатать вручную. –
Какую базу вы используете? Это, скорее всего, потребует системных таблиц, которые будут различаться между базами данных. –