2

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

4

2 回答 2

2

Table-valued functions are a nice way to avoid repetitive SELECT statements, but it isn't the only way to do so. I would put the statements in a view, because it can be indexed. You still can have your table-valued function, which selects records from the view using the parameters.

Imagine that you have the following 2 types of retrievals from your view:

1, SELECT ... WHERE Column1 = @p1

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

In this case you should add the matching two indices to the view

  • Column1

  • Column2 + Column3

于 2012-04-27T20:13:49.600 回答
0

我想也许你的想法是合理的,但方法不是很理想。可能有两种体面的方法可以解决这个问题。首先是创建一个视图:

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'

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

于 2012-04-27T20:12:50.430 回答