Kho dữ liệu Azure - Sự cố chức năng do người dùng xác định


7

Bất cứ ai ở đây đều có may mắn với việc tạo và sử dụng UDF trên cơ sở dữ liệu kho dữ liệu Azure ? Tôi đang trong quá trình di chuyển một kho hàng tại chỗ từ SQL Server 2014 sang Azure datwarhouse và tôi gặp phải một vấn đề với UDFs.

CREATE FUNCTION dbo.fn_GetImpliedRate (@Multiple float, @term int)
RETURNS float
AS
BEGIN
    DECLARE @ImpInt float
    IF(@Term = 1)
        SET @ImpInt = (select [1] from  dbo.ImpliedRate where Multiple = @Multiple); 
    IF(@Term = 2)
        SET @ImpInt = (select [2] from  dbo.ImpliedRate where Multiple = @Multiple); 
    IF(@Term = 3)
        SET @ImpInt = (select [3] from  dbo.ImpliedRate where Multiple = @Multiple); 
    IF(@Term = 4)
        SET @ImpInt = (select [4] from  dbo.ImpliedRate where Multiple = @Multiple); 

RETURN @ImpInt

END;
GO

UDF này hoạt động hoàn hảo trên SQL Server 2014. Khi tôi tạo cái này trên kho dữ liệu Azure, nó được tạo nhưng nó không hoạt động khi tôi truy vấn nó. Nó trả về a NULL. Tôi đã xác minh những điều rõ ràng như liệu bảng mục tiêu có tồn tại hay không. Tất cả đều kiểm tra. Tôi đã xem tài liệu CREATE FUNCTION cho kho dữ liệu Azure và nó có một ví dụ UDF chuyển đổi intthành a decimal. Điều này hoạt động hoàn hảo trên Azure DW. Khoảnh khắc tôi viết một hàm đơn giản có một select, nó thất bại. Thật không may, tài liệu của Azure ở đây không thực sự hữu ích và tôi đã tự hỏi liệu có ai trong số các bạn gặp phải vấn đề này không. Nếu có, bạn đã giải quyết như thế nào?

Tôi vừa thử nghiệm một trường hợp sử dụng khác và nó cũng không hoạt động:

CREATE function [dbo].[fn_GetNumberBusinessDays] 
(
    @StartDate datetime,
    @EndDate Datetime
)
returns int
as 
begin 

DECLARE @NDAYS INT = 0
SELECT @NDAYS = 
  ISNULL( (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END)
  -(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) - 1 ,0) + 1


 SELECT @NDAYS = @NDAYS - COUNT(*)
 FROM dbo.FedHolidays
 WHERE DateOfHoliday BETWEEN @StartDate AND @EndDate


 RETURN @NDAYS
end
GO

Câu trả lời:


6

Các hàm trong Azure DW không hỗ trợ chọn các câu lệnh truy cập các bảng như trong trường hợp sử dụng của bạn, xem TẠO CHỨC NĂNG (Kho dữ liệu SQL) :

function_body
Chỉ định rằng một loạt các câu lệnh Transact-SQL, không tham chiếu dữ liệu cơ sở dữ liệu (bảng hoặc dạng xem), xác định giá trị của hàm.

Bạn có thể kiểm tra lại chức năng đó được tạo trong DW không?


6

Kho dữ liệu SQL SQL có hỗ trợ hạn chế cho UDF. Nó chưa hỗ trợ cú pháp SELECT @var =. Thay vào đó bạn phải sử dụng DECLARE @var int =hoặc SET @var =. Các UDF SQL DW cũng chưa hỗ trợ truy vấn trên các bảng người dùng. Vui lòng sử dụng trang phản hồi của chúng tôi để bỏ phiếu cho các tính năng mới.


8
Trang phản hồi "của chúng tôi"! Bạn có làm việc cho Microsoft không? Sẽ thật tốt nếu bạn tuyên bố liên kết của bạn, ở đây hoặc trong hồ sơ của bạn.
Michael Green

Cảm ơn @sony. Trang tài liệu không cụ thể về điều này và tôi đã bắt đầu với việc di chuyển kho cho một khách hàng hứa hẹn kho Azure sẽ yêu cầu thay đổi tối thiểu so với thứ gì đó như dịch chuyển đỏ. Nếu bạn đến từ Microsoft, tôi đề nghị thay đổi tài liệu để làm cho những điều này rõ ràng.
RK Kuppala

2

Có một tiện ích Di chuyển Kho dữ liệu (có sẵn tại đây ) cho Kho dữ liệu SQL SQL, xử lý các vấn đề như kiểu dữ liệu không tương thích, hàm trong dòng, sử dụng gợi ý, sử dụng RETURNcâu lệnh INSERT ... EXECvà nhiều thứ khác:

Ví dụ báo cáo tương thích cơ sở dữ liệu

Thật không may, nó không nhận các hàm vô hướng mà bảng tham chiếu và thực sự cần. Tuy nhiên, đối với chức năng cụ thể của bạn, nó có thể chỉ là một khung nhìn (hoặc thậm chí là một bảng khác), vd

CREATE VIEW dbo.vw_ImpliedRates
AS
SELECT 1 term, [1] impliedRate, Multiple
FROM  dbo.ImpliedRate 
UNION ALL
SELECT 2 term, [2], Multiple
FROM  dbo.ImpliedRate 
UNION ALL
SELECT 3 term, [3], Multiple
FROM  dbo.ImpliedRate 
UNION ALL
SELECT 4 term, [4], Multiple
FROM  dbo.ImpliedRate;
GO

CREATE TABLE dbo.test
(
    Multiple    FLOAT NOT NULL,
    Term        INT NOT NULL
);
GO

INSERT INTO dbo.test ( Multiple, Term )
VALUES
    ( 0.001, 1 ), ( 0.001, 2 ), ( 0.001, 3 ), ( 0.001, 4 );
GO


SELECT impliedRate, v.Multiple
FROM dbo.test t
    INNER JOIN dbo.vw_ImpliedRates v
        ON t.Multiple = v.Multiple
       AND t.Term = v.Term;

SELECT *
FROM dbo.vw_ImpliedRates
WHERE Multiple = 0.001
  AND Term = 2

Tôi đã thử điều này trên Kho dữ liệu Azure SQL của tôi và nó hoạt động hoàn toàn tốt.

Bạn cũng nên biết rằng các hàm vô hướng trong SQL Server không mở rộng tốt khi được gọi dựa vào các bảng và nếu bạn có âm lượng phù hợp với Kho dữ liệu SQL Azure (tức là hàng tỷ hàng), thì bạn sẽ cần phải nghĩ lại việc sử dụng các hàm vô hướng dù sao. Ví dụ, sử dụng CTASvà viết thêm mã thủ tục là một cách tiếp cận tốt sẽ cho phép bạn sử dụng đúng nền tảng vô cùng mạnh mẽ này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.