表值作为SQL Server存储过程的参数

时间:2018-06-18 08:59:31

标签: sql sql-server

我有table1:col1,col2,col3和table2:col1,col2,col3
我的目标是获得所有记录

where     
t2.col1 like t1.col1 and    
t2.col2 like t1.col2 and    
t2.col3 like t1.col3   

........................................

一个变体是内连接方法

select * from t2 inner join t1 on    
t2.col1 like t1.col1  and  
t2.col2 like t1.col2  and  
t2.col3 like t1.col3     

........................................

另一种变体是基于'其中'的存储过程。条款:

select *  from t2     
where t2.col1 like parameter1  and      
t2.col2 like parameter2  and     
t2.col3 like parameter3    

然后我在VBA中调用该过程并使用for next循环来遍历excel table1中的所有值/参数
........................................
连接方法的执行时间比vba + sp方法慢(~20%,30%),但不幸的是,对于一大组参数,excel冻结。
........................................
是否可以应用循环方法并通过table1值,作为存储过程的参数,在sql server内部,sql脚本,没有vba或c ++或perl等?

我是无法访问db / tables设计的用户。

谢谢

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,问题中的两个问题不等同:

select * from t2 inner join t1 on    
t1.col1 like t2.col1  and  
t1.col2 like t2.col2  and  
t1.col3 like t2.col3     

这里有t1 like t2

select *  from t2     
where t2.col1 like parameter1  and      
t2.col2 like parameter2  and     
t2.col3 like parameter3    

这是t2 like t1的另一种方式。

最终结果会有所不同。

根据示例数据,它看起来应该是t2 like t1

您可以尝试使用CROSS APPLY而不是JOIN重新编写查询,但不太可能在性能方面有任何差异。

SELECT *
FROM
    t1
    CROSS APPLY
    (
        SELECT
        FROM t2
        WHERE
            t2.col1 like t1.col1
            and t2.col2 like t1.col2
            and t2.col3 like t1.col3
    ) AS A
;

此查询结构模仿您的存储过程方法,对于t1中的每一行,您从t2中选择一组行。