Tsql 我应该为常见的大型SQL联接生成表值函数吗

Tsql 我应该为常见的大型SQL联接生成表值函数吗,tsql,join,sql-function,query-parameters,Tsql,Join,Sql Function,Query Parameters,仅使用SQL几个月(这个地方到目前为止帮了我很大的忙,谢谢大家!) 但是,尽管我是一个DB程序员初学者,我已经注意到有许多大型连接,我发现自己在一遍又一遍地重复。我正在考虑为常用联接创建一个表值函数,并允许将一个参数传递到该函数中,该函数将过滤结果 例如。 而不是写作 SELECT * FROM T1 join T2 on T1.A = T2.A join T3 on T2.B = T3.B join T4 on T3.C = T4.D WHERE T1.D

仅使用SQL几个月(这个地方到目前为止帮了我很大的忙,谢谢大家!) 但是,尽管我是一个DB程序员初学者,我已经注意到有许多大型连接,我发现自己在一遍又一遍地重复。我正在考虑为常用联接创建一个表值函数,并允许将一个参数传递到该函数中,该函数将过滤结果

例如。 而不是写作

SELECT * 
FROM T1 join T2 on T1.A = T2.A 
        join T3 on T2.B = T3.B
        join T4 on T3.C = T4.D
WHERE T1.D = '15' AND T2.D = '20' AND T3.C = '12'
我会写

SELECT * 
FROM dbo.SOME_FUNCTION(' T1.D = '15' AND T2.D = '20' AND T3.C = '12' ')
我的问题很简单。这是我应该尝试做的事情吗?还是我想这么做太懒了

我整天都在尝试研究/编写这个函数,但在这方面遇到了很多问题。我知道最终我能/会成功,只是想知道这是否值得我花时间


PS:对不起,如果这个问题很愚蠢的话,这不是我想在这个网站上问的第一个问题,但问题来了。

我想也许你的想法是正确的,但方法不是很理想。这可能有两种体面的方式。第一种方法是创建一个视图:

CREATE VIEW dbo.SOME_VIEW AS
(
    SELECT 
        -- [list out the columns here], do not use *
    FROM 
        T1 
    JOIN 
        T2 on T1.A = T2.A 
    JOIN 
        T3 on T2.B = T3.B
    JOIN 
        T4 on T3.C = T4.D
)
因此,您的查询是:

SELECT * FROM SOME_VIEW
WHERE ...
函数方法可以工作,但我会将函数更改为接受三个参数,而不是您在示例中展示的单字符串方法,因此您可以这样做:

SELECT * FROM dbo.SOME_FUNCTION('15', '20', '12')
同样,根据您访问数据的方式,存储过程可能更合适:

EXEC dbo.spSomeStoredProcedure @T1D = '15', @T2D = '20', @T3C = '12'

编辑:表值函数和存储过程都应使用上述视图。

表值函数是避免重复SELECT语句的好方法,但它不是唯一的方法。我会把语句放在一个视图中,因为它可以被索引。您仍然可以使用表值函数,该函数使用参数从视图中选择记录

假设您的视图中有以下两种类型的检索:

1,
选择。。。其中Column1=@p1

2、
选择。。。其中Column2=@p2和Column3=@p3

在这种情况下,应该将匹配的两个索引添加到视图中

  • 专栏1

  • 第2列+第3列


Ya,问题在于我使用的/SELECT列通常不同。此外,这些表非常庞大(每个表有超过百万行),因此直接查看会非常紧张。@user1329267:Views根本不在乎有多少行。。。创建视图的哪一方面会很紧张?@user1329267:我想试试:)视图中包含的所有行都将根据您的索引首选项进行索引。是的,问题在于我使用的/SELECT列通常不同。连接完成后,也会有大约25列,这就是为什么我要传递字符串(在函数tho中返回和执行查询时会出现很多问题…)这不是一个愚蠢的问题,你在努力提高效率。但是,当应用于关系数据库编程时,DRY原则具有显著的性能影响,因此在该上下文中应用DRY原则时要小心(例如,不要使用嵌套视图(即引用其他视图的视图),多语句表值函数的性能不如内联函数(请参阅(),不要在标量函数中运行select查询等)。您必须在性能和优雅之间取得平衡