Saturday, 24 August 2013

Is this a dumb way to sort a few values?

Is this a dumb way to sort a few values?

I'm checking dimensions on things and I want to know the 3 dimensions from
largest to smallest.
So here's the kinda' whizzy function I wrote:
CREATE FUNCTION dbo.SortDimensions
( @aDim1 udt_Dimension
, @aDim2 udt_Dimension
, @aDim3 udt_Dimension
)
RETURNS @rDimensions TABLE
( Dim1 udt_Dimension
, Dim2 udt_Dimension
, Dim3 udt_Dimension
)
AS
BEGIN
; WITH OrderedDims ( Dimension ) AS (
SELECT @aDim1
UNION ALL SELECT @aDim2
UNION ALL SELECT @aDim3
)
, Pairs ( Name, Value ) AS (
SELECT 'Dim' + CAST( ROW_NUMBER() OVER (ORDER BY( Dimension ) DESC )
AS varchar ), Dimension
FROM OrderedDims
)
INSERT INTO @rDimensions ( Dim1, Dim2, Dim3 )
SELECT MAX(Dim1), MAX(Dim2), MAX(Dim3)
FROM Pairs
PIVOT ( MAX(Value) FOR Name IN ( [Dim1], [Dim2], [Dim3] )) p
RETURN
END
Isn't this a lot of work for doing the same thing as this:
DECLARE @lDim1 udt_Dimension
DECLARE @lDim2 udt_Dimension
DECLARE @lDim2 udt_Dimension
IF @aDim2 > @aDim1
BEGIN
SELECT @lDim1 = @aDim2
, @lDim2 = @aDim1
END
ELSE
BEGIN
SELECT @lDim1 = @aDim1
, @lDim2 = @aDim2
END
IF NOT @aDim3 > @aDim2
BEGIN
SET @lDim3 = @aDim3
END
ELSE
BEGIN
SET @lDim3 = @lDim2
IF @aDim3 > @lDim1
BEGIN
SET @lDim2 = @lDim1
SET @lDim1 = @aDim3
END
ELSE
BEGIN
SET @lDim2 = @aDim3
END
END
INSERT INTO @rDimensions VALUES ( @lDim1, @lDim2, @lDim3 )
I believe a DBA once told me that the guys who designed SQL server reused
the the technology of temp tables for variables, so its pretty much a wash
between tables and variables. (Go ahead and disabuse me of this notion, if
it's not true.)

No comments:

Post a Comment