如果我理解正確的話,你要能夠適應輸入組合的幾種可能性功能,貝科使用你準備好的列作爲輸入可能會在每個函數調用中有所不同。如果是這樣的:
- 顯然,你的函數必須有儘可能多的參數,你有可能列,即對任何列可能會成爲一個「列1」或「2列」,添加一個參數。
- 由於您有許多參數,您需要決定使用哪些參數,或者如果輸入不合理以開始。例如:
- 如果您提供4個參數中的4個,該怎麼辦?拒絕工作?或者該功能可以適應這種情況嗎?
- 如果提供了參數1和4,但是您的功能不適用於該功能,該怎麼辦?例如,它可以用於1 + 2或3 + 4。
最後,選擇的一個或者:
- 設置任何不必要的輸入
NULL
,然後用WHERE
子句查詢一旦自動傳遞任何NULL
輸入(例如:WHERE COL1 = ISNULL(@PAR1, COL1) AND COL2 = ISNULL(@PAR2, COL2)
,需要更多的邏輯爲NULL
能夠列),
- 或者,利用
IF
/ELSE
命令到幾個不同的查詢之間切換(不同的查詢可能是維修頭痛,所以儘可能避免)。
下面是一個例子基礎上的東西我已經有了,但它採用了IF
/ELSE
方法。嘗試做NULL
/ISNULL
代替:
CREATE FUNCTION [dbo].[SomeWackoName]
(@FirstArm tinyint, @SecondArm tinyint, @FirstLeg tinyint, @SecondLeg tinyint)
RETURNS @Results TABLE(
[Value] varchar(60)
) AS
BEGIN
-- For input, we need both arms, or both legs. It is acceptable to provide three inputs.
-- It is unacceptable to provide all four inputs (confusing), or failing to provide any full pair (like one input, or two unpaired inputs).
DECLARE @Validator tinyint = CASE WHEN @FirstArm + @SecondArm IS NULL THEN 0 ELSE 1 END + CASE WHEN @FirstLeg + @SecondLeg IS NULL THEN 0 ELSE 2 END
IF @Validator NOT BETWEEN 1 AND 2 RETURN --THROW 50000, 'INCORRECT INPUT WHYYYYYYYYYYYYYYY WHYYYYYYYYYYYYYYYYYY', 0;
-- Depending on input provided, decide how to behave.
IF @Validator = 1
INSERT INTO @Results SELECT 'I GOT THE ARMS. POPULATE WITH LEGS!!'
ELSE IF @Validator = 2
INSERT INTO @Results SELECT 'I GOT THE LEGS. POPULATE WITH ARMS!!'
-- Return results.
RETURN
END
你的內聯函數有什麼問題? – McNets
懸念真是不可思議!您何時會向您的帖子添加問題? – HABO
@McNets:不知道內聯函數是什麼。 –