2011-09-23 12 views
5

Aynı yapıda 2 tablo var ve bir değişkeni temel alarak hangi prosedürü seçmem gerektiğini seçmek için hangi tabloyu seçmek istediğimi seçmek istiyorum.Bir sorgu yazabilirim koşullu bir tablo seçimi var

Bu mümkün mü?

Ben

declare @table int 
set @table = 1 

Select orderID, Quantity 
from case when @table = 1 then tblOrders else tblSubscriptionOrders end 
where filled = 0 

çalıştı Ama bu

işe yaramadı

cevap

6
Sen çalışacak olan (daha 2 sadece daha tablolara onu en yükseğe çıkarmak istiyorum varsayarak) Bunun için dinamik SQL kullanmak gerekir

ama SQL onun için istatistik oluşturmaz ve sorguyu optimize etmek için daha zor bir zamana sahip olmadığından suboptimaldir.

declare @table sysname 
declare @SQL varchar(1000) 

set @table = 'MyTable' 
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0' 

exec sp_executesql @SQL 

veya bir saklı yordam içinde:

CREATE PROCEDURE p_ConditionalSelect @table sysname 
as 

declare @SQL varchar(1000) 

set @table = 'MyTable' 
SET @SQL='SELECT orderID, Quantity FROM ' + QUOTENAME(@table) + ' WHERE filled=0' 

exec sp_executesql @SQL 
+0

+1. Büyük ihtimalle bu benim sendikamın çözümünü geride bırakacaktı. –

+0

Bir kerelik bir yürütme için bir sp'yi yazmayı denemeye çalışıyorum, bunun nedeni yapmak zorunda olduğum çözüm gibi görünüyor çünkü sonuçta ortaya koyduğum kolay örnekten daha karmaşık. – Chad

3

Seçeneklerden biri Dinamik SQL kullanmaktır ama performans acil mesele değilse, çok daha kolaydır sadece UNION tablolar ve bir kukla eklemek Seçim için [table] sütun.

SELECT orderID, Quantity 
FROM (
    SELECT [table] = 1, orderID, Quantity 
    FROM tblOrders 
    UNION ALL 
    SELECT [table] = 2, orderID, Quantity 
    FROM tblSubscriptionOrders 
) t 
WHERE t.Table = @table 
4

sadece iki tablo varsa bunu yapabilirsiniz:

Declare @table = 1 

SELECT * 
FROM Table1 
WHERE <stuff> 
AND @Table = 1 

UNION ALL 

SELECT * 
FROM Table2 
WHERE <stuff> 
AND @Table = 2 

@table üzerinde filtre yalnızca bir veri gösteren iki yarıdan sonuçlanacaktır.

+0

+1 test edilmedi, ancak bunun en hızlı çözüm olduğunu ancak bunun sunulacağını düşünüyorum. –

2

Bu

declare @table int 
set @table = 1 

Select orderID, Quantity 
From tblOrders 
Where @table = 1 
And filled = 0 

UNION ALL 

Select orderID, Quantity 
From tblSubscriptionOrders 
Where @table = 2 
And filled = 0 

veya bu deneyebilirsiniz:

declare @table int 
set @table = 1 

if @table = 1 
    Select orderID, Quantity 
    From tblOrders 
    Where filled = 0 
else if @table = 2 
    Select orderID, Quantity 
    From tblSubscriptionOrders 
    Where filled = 0