2009-07-16 27 views
1

我正在尋找從具有字段名稱criteria1的許多表中拉出特定行。我遇到的問題是,當我將所有者和表名稱結合起來並嘗試調用「從@t where linenum = 1中選擇條件1」時,SQL希望@t是一個表。我需要知道如何構建完整的表名,然後將其傳遞給此查詢。我知道我可以使用編程語言來訪問數據庫,但是我需要使用SQL。如果有人知道這樣做的更好方式,那也會很棒。在SQL中構建FROM

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+'.'[email protected] 
    select criteria1 from @t where linenum = 1  
    end 
    continue 
end 

回答

4

你可以建立你想要爲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 
+3

作爲一個方面說明,你需要非常小心任何可能的注射時,去這條路線。 – 2009-07-16 19:12:17

+0

@Chris +1 - 但是如果MisterBigs從sysobjects中提取表名,他應該沒問題。除非有人創建了一個名爲'dual; drop table students'的表格;''http://xkcd.com/327/ – banjollity 2009-07-16 19:18:27

+1

構建字符串時使用QUOTENAME(@T)。 – 2009-07-16 19:41:38

2

你有沒有考慮以下構建一個存儲過程?

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(被認爲是對這個問題的空間一個不錯的選擇),this guide to dynamic SQL should help a lot。它幫助我,並且廣泛地使用了動態SQL。

+0

謝謝我會檢查你發佈的鏈接。我不知道桌子的名字,並且有幾千個桌子,所以一個SP不適合這個。 – 2009-07-16 20:02:54

0

也許一個視圖可以在這裏使用?

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') 
1

感謝所有幫助。這是我結束了。

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