po_saa Ответов: 2

Запрос таблицы по object_id


пожалуйста предложите

существует таблица с различными OBJECT_ID-s, ссылающимися на соответствующие таблицы, где данные для каждой записи выбраны из

можно ли получить таблицу в виде набора записей, на который ссылается ее OBJECT_ID

что-то вроде этого

select * from (GET_RECORDSET_FROM_TABLE_BY_OBJECT_ID(@table_object_id))


Что я уже пробовал:

Форумы T-SQL, MSDN, онлайн-справка

2 Ответов

Рейтинг:
2

Richard Deeming

Как сказал Грифф, это похоже на плохой дизайн, и, возможно, случай для модель EAV[^].

Чтобы выбрать записи, вам нужно будет использовать динамический SQL. Очевидно, что вам нужно будет принять все необходимые меры предосторожности, чтобы избежать введения уязвимости SQL-инъекции.

На базовом уровне вам понадобится что-то вроде этого:

DECLARE @TableName nvarchar(257), @command nvarchar(4000), @params nvarchar(100);

SELECT
    @TableName = QUOTENAME(S.name) + N'.' + QUOTENAME(T.name)
FROM
    sys.tables As T
    INNER JOIN sys.schemas As S
    ON S.schema_id = T.schema_id
WHERE
    T.object_id = @table_object_id
;

SET @command = N'SELECT * FROM ' + @TableName + N' WHERE [PK] = @PK';
SET @params = N'@PK uniqueidentifier';
EXEC sp_executesql @command, @params, @PK = @PK;

sp_executesql (Transact-SQL) | Microsoft Docs[^]


po_saa

Привет!

Речь идет не о дизайне.
Это довольно любопытно
Все объекты в базе данных имеют свои собственные идентификаторы.
Когда SQL выполняет запрос, он, очевидно, “переводит” имя запрашиваемой таблицы в системный идентификатор этой таблицы, используя системное представление “all_objects” или каким-либо другим способом.
Затем я задаюсь вопросом, Могу ли я ссылаться на таблицу по ее идентификатору, а не по имени, если я могу получить идентификатор этой таблицы.

Richard Deeming

Единственный способ запросить таблицу по ее идентификатору-это получить имя и использовать динамический SQL. Независимо от того, запрашивает ли SQL Server таблицу по идентификатору за кулисами, он не предоставляет вам никакого способа сделать это напрямую.

po_saa

независимо от того, запрашивает ли SQL Server таблицу по идентификатору за кулисами, он не предоставляет вам никакого способа сделать это напрямую.

Собственно, в этом и был вопрос! :)

Рейтинг:
1

OriginalGriff

Вы имеете в виду объединение: SQL-соединения[^]


po_saa

нет
Соединения для цепных таблицы
это совсем другое дело
Я хотел бы обратиться к таблице по ее идентификатору, а не по имени

это как будто

выберите * из "Table_name"
но
выберите * из "Table_OBJECT_ID"

OriginalGriff

Это означало бы, что у вас есть другая (по идентичной схеме) таблица для каждого объекта в вашей таблице объектов - и это плохая идея, потому что это означает добавление таблицы каждый раз. Они должны быть объединены в одну таблицу и добавлен столбец, позволяющий ссылаться (как внешний ключ) на таблицу объектов. Затем вы используете эту клавишу, чтобы выбрать только нужные строки из одной таблицы. Добавив индекс к этому столбцу, SQL может обрабатывать его довольно эффективно.

Вы можете делать все, что хотите, но это одновременно громоздко, поскольку вам нужно создать новую командную строку, а затем использовать EXEC для ее запуска, а для добавления или удаления объектов Вам также нужно добавлять и удалять таблицы - а это означает, что вам нужны разрешения на удаление таблиц для вашего пользователя, что очень плохая идея!

po_saa

видимо это был не очень хороший пример
Я имел в виду таблицу из которой я выбираю только одну запись по PK а затем привязываю таблицу по ID
Представьте себе таблицу, которая связывает номера сложных устройств и простых устройств.
Каждое устройство имеет свои собственные свойства, описанные в отдельной таблице, и, очевидно, может быть включено в разные устройства
Вот почему я создал "linkTable", который связывает PartNumbers сложных устройств с соответствующими PN их частей.