T-SQL 多用函数替换程序中的 SQL

T-SQL Multi Use Function to Replace SQL in Procedures

假设我在三个过程中有相同的以下代码:

    SELECT CASE
           WHEN [column1] LIKE '%/[a-z][a-z]-[a-z][a-z]/%' THEN REVERSE ( SUBSTRING ( REVERSE ( [column1] ) ,1,PATINDEX ( '%/%',REVERSE ( [column1] )) - 1 )) 
           WHEN [column1] LIKE '' THEN ISNULL ( NULLIF ( [column1],'' ) ,'(not set)' ) 
           ELSE 'Other'
           END AS ColumnReturned
FROM X

1) 是否可以将 "function" 而不是这段代码存储在其他地方,在一个地方?那么我只能打电话:

SELECT myFunction (column1)
FROM X

在程序中。所以如果我想改变逻辑,我只会改变一个地方。

2) 如果我可以拥有 1) 点的功能,我可以同时拥有多个功能 "file" 吗?所以我在一个地方有不同功能的列表?然后我就可以打电话给:

SELECT functionList.myFunction1 (column1)
      ,functionList.myFunction2 (column2)
FROM X

或者功能需要分开,只共享scheme?

我是 T-SQL 函数的新手,所以如果你能指出一些起点,我会很高兴。

你想要的 basic syntax 是:

CREATE FUNCTION dbo.YourFunction (@Column VARCHAR(50))
RETURNS VARCHAR(50)
AS
BEGIN
    RETURN  CASE
                WHEN @Column LIKE '%/[a-z][a-z]-[a-z][a-z]/%' 
                    THEN REVERSE ( SUBSTRING ( REVERSE ( @Column ) ,1,PATINDEX ( '%/%',REVERSE ( @Column )) - 1 )) 
                WHEN @Column LIKE '' 
                    THEN ISNULL ( NULLIF ( @Column,'' ) ,'(not set)' ) 
                    ELSE 'Other'
                END 
END

然后您只需使用:

SELECT dbo.YourFunction (x.column1) AS ColumnReturned
FROM X;

HOWEVER,标量用户定义函数可能会消耗大量性能,将其转换为内联 table 值函数可能会提高性能,因此函数将是:

CREATE FUNCTION dbo.YourFunction (@Column VARCHAR(50))
RETURNS TABLE
AS
RETURN  
(   SELECT  CASE
                WHEN @Column LIKE '%/[a-z][a-z]-[a-z][a-z]/%' 
                    THEN REVERSE ( SUBSTRING ( REVERSE ( @Column ) ,1,PATINDEX ( '%/%',REVERSE ( @Column )) - 1 )) 
                WHEN @Column LIKE '' 
                    THEN ISNULL ( NULLIF ( @Column,'' ) ,'(not set)' ) 
                    ELSE 'Other'
            END AS ColumnReturned
);

这使得调用函数有点复杂,但通常是值得的:

SELECT (SELECT f.ColumnReturned FROM dbo.YourFunction (x.column1) AS f) AS ColumnReturned
FROM X;

SELECT f.ColumnReturned
FROM X
    CROSS APPLY dbo.YourFunction (x.Column1) AS f;