【问题标题】:Table values as parameters for SQL Server stored procedure表值作为 SQL Server 存储过程的参数
【发布时间】:2018-11-27 02:08:03
【问题描述】:

我有 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     

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

另一种变体是基于“where”子句的存储过程:

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

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

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

谢谢

【问题讨论】:

  • col1col2col3 列中是否包含通配符?如果不是,你为什么使用LIKE?另外,您的问题到底是什么?您在底部问的内容非常模糊,但要回答您的问题 “是否可以应用循环方法并通过 table1 值,作为存储过程的参数,在 sql server 内部,在 sql 脚本中,没有 vba 或c++ 或 perl 等?”:是的,你可以在 SQL Server 内部循环;但是,通常这是一个坏主意,接近的数据集几乎总是会更快。
  • 你的表有索引吗?
  • "values are between %" 这是什么意思?这没有任何意义。但是,除非您说 Table1 在 'Green%Yellow%Red' 之类的列中有值,否则这意味着您的表达式将类似于 'Green%Yellow%Red' LIKE 'Green',其计算结果为 false。但是,如果我的猜测也是正确的,那么您的设计模型存在重大问题。
  • col1: %value1%, %value2% etc. so, col1 like '%value1%'
  • 好的,两个 table1 都在表达式的左侧,所以 '%value1%' LIKE 'value1' 将评估为 false。我认为您需要在此处发布一些示例数据、预期结果,并在此处扩展您的问题。我们现在要做的事情太少了。 How to post data for a T-SQL Question

标签: sql sql-server


【解决方案1】:

首先,您在问题中的两个查询是不等价的:

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 中选择一组行。

【讨论】:

  • 它在测试表上运行良好。现在我必须在一个真实的桌子上进行测试,大约 t1。 100, t2 约百万
  • @user2284877,与您的 VBA 代码相比,了解它在真实表上的执行情况会很有趣。
  • join=超过 47 分钟; (vba+where sp) = 1.03 分钟; table1 只包含一行:%keyword1% 和 %keyword2% 和 %keyword3%;所有三个方法都返回(相同)188 行。
  • @user2284877,即使读取 100M 行也不应该花费 47 分钟。唯一想到的是:LIKE左右的列是什么类型的?它们在两个表中是否相同?
  • t2 来自多个连接的结果,列连接在一起,其他同事在同一张表上运行脚本。但在 vba 中选择 where 的条件相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2023-03-20
相关资源
最近更新 更多