Eu tenho uma função com valor de tabela
CREATE FUNCTION [dbo].[DateRange]
(
@StartDate date,
@EndDate date,
@Location varchar(25),
@Device varchar(25)
)
RETURNS TABLE
AS
RETURN
(
SELECT *
FROM MyTable
WHERE Date < @EndDate AND
Date > @StartDate AND
Location = @Location AND
Device = @Device
);
Agora eu gostaria de dar ao usuário a opção de usar NULL como parâmetro de localização e/ou parâmetro de dispositivo para que ele receba todos os dados independentes da localização e do dispositivo de volta
Qual seria a maneira mais elegante e eficiente de fazer isso?
Igual a :
SE as colunas
device
elocation
puderem ser NULL, você pode querer considerar esta opção:Isso funcionaria se você estivesse usando um tipo de tabela UD para o local, como você perguntou em seu comentário. Apenas certifique-se de que o parâmetro de entrada seja somente leitura. No entanto, você não pode passar NULL para um parâmetro do tipo tabela, você deve passar um objeto de parâmetro vazio desse tipo:
Chame-o:
A maneira mais eficiente de acordo com meus próprios testes é:
*Observação: válido apenas para colunas NON-NULLABLE, conforme comentado por Aaron.
Existe outra forma, usando
ISNULL(@Location,Location)
ao invés deCASE
expressão, porém, por mais elegante que seja, é menos eficiente entãoCASE
.Tudo bem, encontrei uma maneira de fazer o mesmo com tipos com valor de tabela