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;
假设我在三个过程中有相同的以下代码:
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;