#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 (...)