SQL Server 2008 R2에서 실행 중입니다. 주소의 일부를 연결하고 화면에 표시 할 형식화 된 결과를 반환하는 스칼라 함수를 작성하고 싶습니다. 하지만 내가 돌려받는 것은 @Address 변수뿐입니다. 도시, 주, 우편 번호, 국가는 값에 추가되지 않습니다. 이것은 간단해야합니다. 내가 도대체 뭘 잘못하고있는 겁니까?
이것은 내 스칼라 함수입니다.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
;
ALTER FUNCTION [dbo].[fnScreenAddress] (@Id INT)
RETURNS VARCHAR(50)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ScreenAddress VARCHAR(50), -- The return value
@Address VARCHAR(64),
@UnitNumber VARCHAR(16),
@City VARCHAR(50),
@State CHAR(2),
@PostalCode VARCHAR(16),
@CountryCode VARCHAR(16);
SELECT
@Address = [Address],
@UnitNumber = ISNULL([UnitNumber], ''),
@City = [City],
@State = [State],
@PostalCode = [PostalCode],
@CountryCode = ISNULL([CountryCode], '')
FROM
[dbo].[LPAddress]
WHERE
[ID] = @Id;
SET @ScreenAddress = @Address;
IF @City <> ''
BEGIN
SET @ScreenAddress = @ScreenAddress + ', ';
END;
SET @ScreenAddress = @ScreenAddress + @City;
IF @State <> ''
BEGIN
SET @ScreenAddress = @ScreenAddress + ', ';
END;
SET @ScreenAddress = @ScreenAddress + @State;
SET @ScreenAddress = @ScreenAddress + @PostalCode;
SET @ScreenAddress = @ScreenAddress + @CountryCode;
SET @ScreenAddress = LTRIM(RTRIM(@ScreenAddress));
RETURN(@ScreenAddress);
END;
이를 테스트하기 위해 쿼리 창에 다음 명령을 입력합니다.
select
id, address, city, state, postalcode, countrycode,
dbo.fnScreenAddress(id) as [ScreenAddress]
from
lpaddress;
그리고이 결과 세트를 얻습니다.
훨씬 더 간단한 버전은 다음과 같습니다 .....
ALTER FUNCTION [dbo].[fnScreenAddress]
(
@Id INT
)
RETURNS VARCHAR(4000)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ScreenAddress VARCHAR(4000); -- The return value
SELECT @ScreenAddress =
STUFF(
ISNULL( ', ' + NULLIF([Address] , '') , '')
+ ISNULL( ', ' + NULLIF([UnitNumber] , '') , '')
+ ISNULL( ', ' + NULLIF([City] , '') , '')
+ ISNULL( ', ' + NULLIF([State] , '') , '')
+ ISNULL( ', ' + NULLIF([PostalCode] , '') , '')
+ ISNULL( ', ' + NULLIF([CountryCode], '') , '') , 1,2,'')
FROM [dbo].[LPAddress]
WHERE [ID] = @Id
RETURN @ScreenAddress;
END;
중요 사항
이 목적으로 Scalar 함수를 사용하지 않을 것입니다. Scalar 함수는 성능을 저하시키는 요소이며 특히이 특정 경우에는 함수가 선택한 행이 반환되는만큼 여러 번 호출됩니다. 더 나은 성능을 얻으려면 선택 쿼리에 함수 코드를 추가하기 만하면됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다