2016-05-24 4 views
1

Я полный новичок SQL. У меня есть две временные таблицы со значениями, например:Есть ли что-то вроде «указателя таблицы»?

create table #MyTable1(...) 
create table #MyTable2(...) 
insert into #MyTable1(...) 
values(...) 
insert into #MyTable2(...) 
values(...) 

Теперь мне интересно, если это можно назвать обе таблицы не напрямую, а с помощью что-то вроде «указатель таблицы»? Мне нужно что-то вроде этого:

MyTableVariable = #MyTable1 
select * from MyTableVariable /*outputs content of MyTable1*/ 
MyTableVariable = #MyTable2 
select * from MyTableVariable /*outputs content of MyTable2*/ 

Существует ли подход в SQL/TSQL?

+1

Не уверен, что существует, но он также может зависеть от сервера БД ... Oracle? Informix? Mysql? Сервер Sql? –

+0

MS SQL Server 2012 – MichaelXanadu

+1

Но почему? Вы хотите, чтобы псевдоним имени таблицы или это попытка сделать таблицу ссылкой динамической? –

ответ

1

Нет, в T-SQL нет указателя таблицы, но есть динамический SQL:

CREATE TABLE #MyTable(ID INT, Content VARCHAR(100)); 
INSERT INTO #MyTable VALUES(1,'Test 1'),(2,'Test 2'); 

DECLARE @dynamicTablePointer VARCHAR(100)='#MyTable'; 

DECLARE @cmd VARCHAR(MAX)='SELECT * FROM ' + @dynamicTablePointer; 

EXEC(@cmd); 

Это имеет некоторые ограничения (например, не могут быть использованы в одноранговой SQL, функции,), но позволяет динамические ссылки на таблицы и имена столбцов.

1

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

create table #MyTable1(col1 int) 
create table #MyTable2(col2 int) 

DECLARE @MyTableVariable NVARCHAR(50); 
DECLARE @SQLString NVARCHAR(500); 

--selecte from the first table 
SET @MyTableVariable= '#MyTable1' 
SET @SQLString =N'select * from '[email protected]+';'; 
EXECUTE sp_executesql @SQLString; 

--select from the second table 
SET @MyTableVariable = '#MyTable2' 
SET @SQLString =N'select * from '[email protected]+';'; 
EXECUTE sp_executesql @SQLString; 
2

Нет SQL Server не неотъемлемы указатели поддержки отчасти это связанно с тем, что структурой запросы Языки являются декларативным характером (не список команд или шагов, которые должны быть выполнены вместо этого вы описать желаемый результат) , Учитывая это, таблицы не являются сложными объектами стиля C# или Java, которые должны быть переданы от одного метода к другому, вместо этого они являются связанными данными, хранящимися в структурированном формате в базе данных, которые могут быть запрошены любым, у кого есть необходимые разрешения, так как так что на самом деле нет необходимости ссылаться на них с помощью указателя.

Существует несколько способов моделирования поведения стиля указателя. Один из методов, для которого вам уже было предоставлено несколько примеров, - просто использовать динамический SQL и передать таблицу в запрос как строковый параметр. Другой способ заключается в использовании синонимов, смотрите пример ниже:

CREATE SYNONYM [MyTableSynonym] FOR #Table1 

    SELECT * 
    FROM [MyTableSynonym] 

    DROP SYNONYM [MyTableSynonym] 

    CREATE SYNONYM [MyTableSynonym] FOR #Table2 

    SELECT * 
    FROM [MyTableSynonym] 

    DROP SYNONYM [MyTableSynonym] 

выше метод не рекомендуется, так как теперь мы используем синонимов таким образом, там, где не предполагалось.

Вопрос в том, какие преимущества были реализованы с помощью любого метода? Количество кода для запроса двух таблиц увеличилось, сложность запросов увеличилась, вероятность ошибок в коде увеличилась, и попытки отладки запросов такого характера станут кошмаром. Даже если верный указатель, где поддерживается, я могу думать только о нескольких сценариях, где это может быть полезно.

1

Совершенно другой подход будет для UNION обеих ваших временных таблиц. Это решение применимо, если обе таблицы имеют одну и ту же структуру столбцов, и вам необходимо вывести все данные вместе. В этом случае, почему бы не сделать это так: SELECT col1, col2, col3 FROM #table1 UNION ALL SELECT col1, col2, col3 FROM #table2

Сказав, что, если структуры данных (столбцы) совершенно различны, динамический SQL ваше решение.

Смежные вопросы