2014-06-11 16 views
0

我有以下在proc中運行的查詢。函數MyFunction返回一個表,並且該查詢加入該表。當提供@MyArg值時,該過程非常有用。但是,我想知道是否有辦法在數據庫中的所有@MyArg值上運行此操作。我確信有一種方法可以在一個循環內完成它,但我知道在db層通常要避免循環。在一個參數的幾個不同的值上運行一個proc

我真的只需要執行此操作以檢查(並可能清理)一些不良數據。

SELECT ColumnA, ColumnB, ColumnC 
FROM 
(  
    SELECT 
     a.ColumnA, 
     a.ColumnB, 
     a.ColumnC, 
     ROW_NUMBER() 
      over(partition by a.ColumnD order by f.ColumnX) as RowNum 
    FROM dbo.MyTableA AS a 
     INNER JOIN dbo.MyFunction(@MyArg) f ON f.myID = a.myID 
    WHERE (a.myBit = 1 OR a.myID = @MyArg) 
) AS x 
WHERE x.rownum = 1; 
+0

如果您沒有提供@MyArg值會發生什麼? –

+0

你能否提供這個功能? –

回答

0
if @MyArg= 0 
select @MyArg =null 

    SELECT ColumnA, ColumnB, ColumnC 
    FROM 
    (  
    SELECT 
    a.ColumnA, 
    a.ColumnB, 
    a.ColumnC, 
    ROW_NUMBER() 
     over(partition by a.ColumnD order by f.ColumnX) as RowNum 
FROM dbo.MyTableA AS a 
    INNER JOIN dbo.MyFunction(@MyArg) f ON f.myID = a.myID 
WHERE (a.myBit = 1 OR a.myID = @MyArg) 
) AS x 
    WHERE x.rownum = 1; 

在函數中添加

WHERE 
(args.MyArg=COALESCE(@MyArg, args.MyArg) or (@MyArg is null)) 

這將搜索所有MyArgs值在表

1

您可以使用跨應用

with args as 
(
    select distinct myarg 
    from tbl 
) 

select f.* 
from args 
cross apply dbo.myfunction(myarg) f 
相關問題