2014-09-06 46 views
1

这是一个相当温和的问题,但是如何创建一个用户定义函数的SQL服务器

我有我试图简化可读性相当大的存储过程

它包含了许多union子句与像下面图1所示

图1的一个声明

SELECT COUNT(1) AS Total 
    FROM Orders 
    WHERE (NOT EXISTS (
     SELECT 1 
     FROM (
      SELECT Id 
      FROM OrderLineItems 
      WHERE Orders.Id = Order_Id) AS Sub 
     WHERE EXISTS (
      SELECT 1 
       FROM NormalizedLineItems 
       WHERE (Sub.Id = OrderLineItem_Id) 
       AND (OutOfStock = 1)))) 
    AND (EXISTS (
     SELECT 1 AS Total 
     FROM OrderShipments 
     WHERE (Orders.Id = Order_Id) 
      AND (CarrierApproved = 0))) 
    AND (IsQuote = 0) 
    AND (Cancelled = 0) 
    AND (Archived = 0) 
    AND (Completed = 0) 
    AND (Holding = 0) 

但是也有很多REOC curring图案在每个语句

以下图案变成了几次图2

图2

WHERE (NOT EXISTS (
     SELECT 1 
     FROM (
      SELECT Id 
      FROM OrderLineItems 
      WHERE Orders.Id = Order_Id) AS Sub 
     WHERE EXISTS (
      SELECT 1 
       FROM NormalizedLineItems 
       WHERE (Sub.Id = OrderLineItem_Id) 
       AND (OutOfStock = 1)))) 

进出口试图(出于可读性目的)减少在存储在主代码程序

所以我认为ID性能测试的UDF,我想出了以下图3

图3

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE FUNCTION TestFunction (@OrderId int) 
RETURNS TABLE 
AS 
    RETURN 
    (
    -- Add the SELECT statement with parameter references here 
    SELECT 1 AS Total 
    FROM (
     SELECT OrderLineItems.Id AS Id 
     FROM OrderLineItems 
     WHERE @OrderId = Order_Id) AS Sub 
    WHERE EXISTS (
     SELECT 1 AS Total 
      FROM NormalizedLineItems 
      WHERE (Sub.Id = OrderLineItem_Id) 
      AND (OutOfStock = 1))) 
GO 

所有虽然上述编译,我真的不知道我在正确的轨道上,我遇到各种各样的问题试图上述UDF向原查询

我在想,如果有人可以给我从图1如何抽象图2的具体例子为UDF这样我就可以至少性能测试解决方案,看看它的价值,而

注:我知道用户定义的功能可能是一场性能噩梦,但即使我不能在一个阶段,我也不会

SELECT COUNT(1) AS Total 
    FROM Orders 
    join order_ids 
    on order_ids.order_id = Orders.order_id 
... 

如果再次发生语句只在一个:EST

感谢

+0

这可能是使用UDF简化where子句中的代码的最后一个选择。使用CTE或常规表格进行可重用数据是一种很好的做法。或者'EXEC'动态查询由不同的sql语句字符串组合而成。 – 2014-09-06 02:51:24

+0

感谢您的意见和回答,对您提出的观点进行了不恰当的研究,并测试了您的代码,为我提供了深思熟虑的内容 – 2014-09-06 02:55:25

回答

1

只名为ORDER_ID

Insert into order_ids 
select order_id from 
    FROM Orders 
    WHERE (NOT EXISTS (
     SELECT 1 
     FROM (
      SELECT Id 
      FROM OrderLineItems 
      WHERE Orders.Id = Order_Id) AS Sub 
     WHERE EXISTS (
      SELECT 1 
       FROM NormalizedLineItems 
       WHERE (Sub.Id = OrderLineItem_Id) 
       AND (OutOfStock = 1)))) 

然后你就可以简化您的SQL像这样的列上创建order_ids表查询, Common Table Expression是最佳选择:

with CTE_order_ids as 
(select order_id from 
    FROM Orders 
    WHERE (NOT EXISTS (
     SELECT 1 
     FROM (
      SELECT Id 
      FROM OrderLineItems 
      WHERE Orders.Id = Order_Id) AS Sub 
     WHERE EXISTS (
      SELECT 1 
       FROM NormalizedLineItems 
       WHERE (Sub.Id = OrderLineItem_Id) 
       AND (OutOfStock = 1)))) 
) 
SELECT COUNT(1) AS Total 
    FROM Orders 
    join CTE_order_ids 
    on order_ids.order_id = Orders.order_id 
... 
+0

感谢您的支持,我对它进行了测试,并且还给了我一个很好的性能优势 – 2014-09-06 05:05:00

相关问题