我应该为常见的大型连接SQL创建表值函数

时间:2012-04-27 19:56:48

标签: tsql join sql-function query-parameters

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

EG。 而不是写

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:对不起,如果这个问题很愚蠢,不是我想在这个网站上提出的第一个问题,而是这里的问题。

2 个答案:

答案 0 :(得分:2)

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

想象一下,您的视图中有以下两种类型的检索:

1,SELECT ... WHERE Column1 = @p1

2,SELECT ... WHERE Column2 = @p2 AND Column3 = @p3

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

  • 列1

  • Column2 + Column3

答案 1 :(得分:0)

我想也许你的想法很合理,但这种方法并不理想。可能有两种不错的方法可以解决这个问题。第一个是创建一个VIEW:

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'

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