2012-06-04 2 views
2

мне нужно выбрать из таблицы, где суффикс имени таблицы из другой таблицы, например:Запрос нескольких таблиц в TSQL, где имя таблицы приходит из другой таблицы

declare @value nvarchar(3), 
@table nvarchar(1000), 
@SQLST NVARCHAR(255); 

set @value = N'select column1 from tableX'; 

EXEC @value 

set @table ='partoftableY' 

Set @SQLST ='select * from' [email protected] + @value -- here I create the table name 

Однако есть несколько значений в TableX (0-999), и поэтому это не работает. Мне нужна конструкция для каждого типа.

+1

есть два способа сделать это - и вы не можете сделать для-каждого (так называемого курсора) - это может быть возможно в заданная операция. Расскажите, пожалуйста, что вы делаете с результатами, и мы посмотрим, какое лучшее решение. –

+0

Привет, ну в конце мне нужно собрать все таблицы в один. Например: результат будет десятью таблицами – user1434979

ответ

1

здесь в качестве примера я создал с двумя таблицами (partoftableY1 & partoftableY2) с различными данными в каждом

/* 

create table tableX (column1 int); 

insert into tablex 
      select 1 
union all select 2; 

create table partoftableY1 (data nvarchar(50)); 
create table partoftableY2 (data nvarchar(50)); 

insert into partoftableY1 select 'hey 1 here'; 
insert into partoftableY2 select 'hey 2 here'; 

*/ 


declare @sql nvarchar(max) 

-- use the ability of SQL to build up string of all the sql you need to run 

set @sql = 'select data from (select '''' as data' 

select @sql = COALESCE(@sql + ' union all ', '') 
       + 'select data from partoftableY' 
       + cast(column1 as nvarchar(4)) from tableX 
select @sql = @sql + ') X where data <>''''' 

-- DEBUG for seeing what SQL you created 
print @sql 

-- Now execute the SQL 
exec sp_executesql @sql= @sql 

, который дает мне результаты

hey 1 here 
hey 2 here 

Вам нужно будет настроить его для типов ваших данных, но это должно дать вам основную идею.

Для повторной Ференц вот SQL, который был создан и выполнен:

select data 
from (
       select '' as data 
     union all select data from partoftableY1 
     union all select data from partoftableY2 
    ) X 
where data <>'' 

нотабене

  • я положить отформатирован его для более легкого чтения, как это на самом деле создается как одна длинная линия
  • я использовал selet данные, а не выбрать * как число столбцов должно быть одинаковым для каждого выбора в союзе , Вам нужно будет выбрать нужные столбцы, а затем внести изменения, чтобы все столбцы в выборе в объединении были одинаковыми.
  • В верхней части союза есть фиктивный флажок, чтобы сделать код объединения легким - никаких условностей не требуется, так как необходимо, чтобы все объединение представляло
  • Я использовал выбор out по всему соединению, чтобы вы могли получить sid манекена выбрать
+0

Спасибо :) Я думаю, что получаю идею. Результат (вся таблица, которая существует) будет все объединение в одной таблице. – user1434979

+0

да, но вам нужно быть осторожным и поставить код проверки, чтобы избежать дубликатов из таблицы ex. И другие ошибки, такие как наличие данных в tablex, но другая таблица не существует и т. Д. –

+0

Другое дело, что вы имели в виду по данным? столбцы для выбора? Спасибо – user1434979

0

вы можете попробовать это

DECLARE @SQLST NVARCHAR(max)=''; 

DECLARE @select nvarchar(max)=N'select * from partoftableY' 

DECLARE @union nvarchar(max)=N' 
UNION ALL 
' 
SELECT @[email protected][email protected] 
FROM tablex 

SELECT @SQLST=substring(@SQLST,1,LEN(@SQLST)-11) 

EXEC sp_executesql @SQLST 
+0

partoftableY является частью примера таблицы: существует несколько таблиц, таких как customerY, custormerX, customerZ, customerA. Поэтому я пытаюсь найти клиента + @a, где @a содержит (Y, Z, X, A), и это @a получается из выбора из другой таблицы (имен) – user1434979

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