这是一个相当温和的问题,但是如何创建一个用户定义函数的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
感谢
这可能是使用UDF简化where子句中的代码的最后一个选择。使用CTE或常规表格进行可重用数据是一种很好的做法。或者'EXEC'动态查询由不同的sql语句字符串组合而成。 – 2014-09-06 02:51:24
感谢您的意见和回答,对您提出的观点进行了不恰当的研究,并测试了您的代码,为我提供了深思熟虑的内容 – 2014-09-06 02:55:25