Рейтинг:
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
po_saa
нет
Соединения для цепных таблицы
это совсем другое дело
Я хотел бы обратиться к таблице по ее идентификатору, а не по имени
это как будто
выберите * из "Table_name"
но
выберите * из "Table_OBJECT_ID"
OriginalGriff
Это означало бы, что у вас есть другая (по идентичной схеме) таблица для каждого объекта в вашей таблице объектов - и это плохая идея, потому что это означает добавление таблицы каждый раз. Они должны быть объединены в одну таблицу и добавлен столбец, позволяющий ссылаться (как внешний ключ) на таблицу объектов. Затем вы используете эту клавишу, чтобы выбрать только нужные строки из одной таблицы. Добавив индекс к этому столбцу, SQL может обрабатывать его довольно эффективно.
Вы можете делать все, что хотите, но это одновременно громоздко, поскольку вам нужно создать новую командную строку, а затем использовать EXEC для ее запуска, а для добавления или удаления объектов Вам также нужно добавлять и удалять таблицы - а это означает, что вам нужны разрешения на удаление таблиц для вашего пользователя, что очень плохая идея!
po_saa
видимо это был не очень хороший пример
Я имел в виду таблицу из которой я выбираю только одну запись по PK а затем привязываю таблицу по ID
Представьте себе таблицу, которая связывает номера сложных устройств и простых устройств.
Каждое устройство имеет свои собственные свойства, описанные в отдельной таблице, и, очевидно, может быть включено в разные устройства
Вот почему я создал "linkTable", который связывает PartNumbers сложных устройств с соответствующими PN их частей.