Построение FROM в SQL - PullRequest
       18

Построение FROM в SQL

1 голос
/ 16 июля 2009

Я хочу вытащить определенную строку из ряда таблиц, которые имеют критерии имени поля1. Проблема, с которой я сталкиваюсь, заключается в том, что когда я объединяю владельца и имя таблицы и пытаюсь вызвать «выберите критерии1 из @t, где linenum = 1», SQL ожидает, что @t будет таблицей. Мне нужно знать, как создать полное имя таблицы, а затем передать его в этот запрос. Я знаю, что могу использовать язык программирования для доступа к БД, но мне нужно, чтобы это было в SQL. Если кто-то знает о лучшем способе сделать это, это было бы также здорово.

declare @next as varchar
declare @owner varchar

while 1=1
begin
  set @next = (select top 1 o.name FROM syscolumns c inner join sysobjects o on c.id = o.id 
               where c.name = 'criteria1' and o.id > @next order by o.id)    

  if @next is null
    break
  else
  begin
    set @owner = (select top 1 u.name 
                  FROM syscolumns c inner join 
                       sysobjects o on c.id = o.id left join 
                       sysusers u on o.uid=u.uid
                  where c.name = 'criteria1' and o.id = @next order by o.id)
    declare @t as varchar
    set @t = @owner+'.'+@next
    select criteria1 from @t where linenum = 1      
  end
  continue
end  

Ответы [ 4 ]

4 голосов
/ 16 июля 2009

Вы можете построить весь требуемый запрос как varchar (), а затем выполнить его с помощью хранимой процедуры sp_executesql.

http://msdn.microsoft.com/en-us/library/ms188001.aspx

В вашем случае этот бит в конце становится

declare @sql varchar(512);
set @sql = 'select criteria1 from ' + @t + ' where linenum = 1'          
sp_executesql @sql
2 голосов
/ 16 июля 2009

Рассматривали ли вы следующую конструкцию в хранимой процедуре?

  CASE @tablename
     WHEN 'table1' THEN SELECT * FROM table1
     WHEN 'table2' THEN SELECT * FROM table2
     WHEN 'table3' THEN SELECT * FROM table3
     WHEN 'table4' THEN SELECT * FROM table4
  END

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

1 голос
/ 17 июля 2009

Спасибо за помощь. Это то, что я закончил.

declare cur cursor for
select   u.name + '.' + o.name tname
    FROM sysobject o left join 
         syscolumns c  on c.id = o.id left join 
         sysusers u on o.uid=u.uid
    where c.name = 'criteria1'

declare @tn as varchar(512)
open cur
fetch next from cur into @tn

create table holding_table ( val varchar(512), table_name varchar(512))
declare @sql nvarchar(1000)

while @@FETCH_STATUS = 0
begin
    set @sql = 'insert into holding_table select criteria1, ''' + @tn + ''' from ' + @tn + ' where linenum = 1'
    execute sp_executesql @sql  
    fetch next from cur into @tn    
end
close cur
deallocate cur
0 голосов
/ 17 июля 2009

Может быть, здесь можно использовать вид?

CREATE VIEW vCriterias
AS
SELECT 'Table1' AS TableName,
linenum,
criteria1
FROM Table1
UNION ALL
SELECT 'Table2' AS TableName,
linenum,
criteria1
FROM Table2
UNION ALL
SELECT 'Table3' AS TableName,
linenum,
criteria1
FROM Table3

go

Тогда выбор такой:

   SELECT criteria1
   FROM vCriterias
   WHERE linenum = 3 
   AND TableName IN ('Table1','Table3')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...