Функция SQL с несколькими параметрами

#sql-server #function #parameters

#sql-сервер #функция #параметры

Вопрос:

 CREATE TYPE IdRange AS TABLE 
(
    IDValue NVARCHAR(MAX)
);

CREATE FUNCTION GET_CUSTOMER_WITH_ID
    (@myIDRange IdRange)
RETURNS @ReturnTable TABLE  
AS 
BEGIN
    SELECT  
        MY_CC.CustomerID AS [Customer ID], 
        CONCAT(MY_CC.FirstName, ' ', MY_CC.LastName) As Name, 
        MY_CC.City, MY_CC.State, MY_CC.ZipCode, 
        MY_CC.DateOfBirth, 
        MY_AS.EventType AS [Application Status], 
        MY_AS.EventDateTime AS [Timestamp], MY_AS.ExpirationDate
    FROM 
        [database].[dbo].[MY_CustomerCard] AS MY_CC
    INNER JOIN 
        [database].[dbo].[MY_ApplicationStatus] AS MY_AS ON MY_CC.CustomerID = MY_AS.CustomerID 
    WHERE 
        MY_CC.CustomerID IN (SELECT IDValue FROM @myIdRange)

    RETURN;
 

Я хочу создать функцию, которая выполняет что-то вроде

 SELECT 
    MY_CC.CustomerID AS [Customer ID], 
    CONCAT(MY_CC.FirstName, ' ', MY_CC.LastName) AS Name, 
    MY_CC.City, MY_CC.State, MY_CC.ZipCode, 
    MY_CC.DateOfBirth,
    MY_AS.EventType AS [Application Status], 
    MY_AS.EventDateTime AS [Timestamp], MY_AS.ExpirationDate
FROM 
    [database].[dbo].[MY_CustomerCard] AS MY_CC
INNER JOIN 
    [database].[dbo].[MY_ApplicationStatus] AS MY_AS ON MY_CC.CustomerID = MY_AS.CustomerID 
WHERE 
    CUSTOMERID >= @firstParameter AND CUSTOMERID <= @secondParameter
 

У меня возникли проблемы с получением значения параметра или знанием того, как правильно проанализировать параметры.

Пожалуйста, помогите.


 CREATE FUNCTION dbo.GET_CUSTOMER_WITH_ID
    (@startParam int, @endParam int)
RETURNS TABLE
WITH SCHEMABINDING -- better for performance, but blocks changes to underlying objects, forces two-part names
AS
    SELECT 
        MY_CC.CustomerID, 
        CONCAT(MY_CC.FirstName, ' ', MY_CC.LastName) AS Name, 
        MY_CC.City, MY_CC.State, MY_CC.ZipCode, 
        MY_CC.DateOfBirth, 
        MY_AS.EventType, MY_AS.EventDateTime AS [Timestamp], 
        MY_AS.ExpirationDate
    FROM
        [database].[dbo].[RF_CustomerCard] AS RF_CC
    INNER JOIN 
        [database].[dbo].[MY_ApplicationStatus] AS RF_AS ON MY_CC.CustomerID = MY_AS.CustomerID
    WHERE 
        MY_CC.CustomerID BETWEEN @startParam AND @endParam;
GO;
 

Я получаю сообщение об ошибке:

Синтаксическая ошибка при ВЫБОРЕ MY_CC

Комментарии:

1. Итак, вам нужен диапазон (начало и конец) или вам нужен список идентификаторов

2. я хочу указать начало и конец и получить список всех записей (а не только идентификаторов) между двумя указанными параметрами

Ответ №1:

Вам лучше всего создать встроенную табличную функцию, они намного более производительны, чем стиль, который вы пробовали (Multi-Statement):

 CREATE FUNCTION dbo.GET_CUSTOMER_WITH_ID
( @Id int )
RETURNS TABLE
WITH SCHEMABINDING -- better for performance, but blocks changes to underlying objects, forces two-part names
AS RETURN
(
SELECT
    MY_CC.CustomerID As CustomerID,
    CONCAT(MY_CC.FirstName, ' ', MY_CC.LastName) As Name,
    MY_CC.City,
    MY_CC.State,
    MY_CC.ZipCode,
    MY_CC.DateOfBirth,
    MY_AS.EventType As ApplicationStatus,
    MY_AS.EventDateTime As [Timestamp],
    MY_AS.ExpirationDate
FROM [dbo].[MY_CustomerCard] AS MY_CC
INNER JOIN [dbo].[MY_ApplicationStatus] AS MY_AS 
  ON MY_CC.CustomerID = MY_AS.CustomerID
WHERE MY_CC.CUSTOMERID = @id
)
;
GO
 

Теперь, вместо того, чтобы передавать весь диапазон или список, вы можете просто CROSS APPLY или OUTER APPLY эту функцию для каждой внешней строки:

 SELECT *
FROM @myIDRange ids
CROSS APPLY dbo.GET_CUSTOMER_WITH_ID ( ids.idValue) c;

SELECT *
FROM OtherList ids
CROSS APPLY dbo.GET_CUSTOMER_WITH_ID ( ids.idValue) c
WHERE ids.idValue BETWEEN @startParam AND @endParam;
 

Вы также можете изменить функцию напрямую, чтобы предоставить эти два параметра, если это работает лучше для вас:

 CREATE FUNCTION dbo.GET_CUSTOMER_WITH_ID
( @startParam int, @endParam int )
........
WHERE MY_CC.CUSTOMERID BETWEEN @startParam AND @endParam
)
;

GO
 

Сделайте себе одолжение и не используйте имена столбцов, которые нуждаются в кавычках []

Комментарии:

1. Я получаю синтаксическую ошибку.

2. Извините, забыл AS RETURN (...)