Menerapkan Ekspresi CASE dalam Prosedur Tersimpan yang Dikompilasi Secara Asli
Berlaku untuk: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Berlaku untuk: Azure SQL Database dan SQL Server memulai SQL Server 2017 (14.x)
Ekspresi CASE didukung dalam modul T-SQL yang dikompilasi secara asli. Contoh berikut menunjukkan cara untuk menggunakan ekspresi CASE dalam kueri.
-- Query using a CASE expression in a natively compiled stored procedure.
CREATE PROCEDURE dbo.usp_SOHOnlineOrderResult
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE=N'us_english')
SELECT
SalesOrderID,
CASE (OnlineOrderFlag)
WHEN 1 THEN N'Order placed online by customer'
ELSE N'Order placed by sales person'
END
FROM Sales.SalesOrderHeader_inmem
END
GO
EXEC dbo.usp_SOHOnlineOrderResult
GO
Berlaku untuk: SQL Server 2014 (12.x) dan SQL Server memulai SQL Server 2016 (13.x)
Ekspresi CASE tidak didukung dalam modul T-SQL yang dikompilasi secara asli. Sampel berikut menunjukkan cara untuk mengimplementasikan fungsionalitas ekspresi CASE dalam prosedur tersimpan yang dikompilasi secara asli.
Sampel kode menggunakan variabel tabel untuk membuat satu tataan hasil. Ini hanya cocok saat memproses jumlah baris yang terbatas, karena melibatkan pembuatan salinan tambahan baris data.
Anda harus menguji performa solusi ini.
-- original query
SELECT
SalesOrderID,
CASE (OnlineOrderFlag)
WHEN 1 THEN N'Order placed online by customer'
ELSE N'Order placed by sales person'
END
FROM Sales.SalesOrderHeader_inmem
-- workaround for CASE in natively compiled stored procedures
-- use a table for the single resultset
CREATE TYPE dbo.SOHOnlineOrderResult AS TABLE
(
SalesOrderID uniqueidentifier not null index ix_SalesOrderID,
OrderFlag nvarchar(100) not null
) with (memory_optimized=on)
go
-- natively compiled stored procedure that includes the query
CREATE PROCEDURE dbo.usp_SOHOnlineOrderResult
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS BEGIN ATOMIC WITH
(TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE=N'us_english')
-- table variable for creating the single resultset
DECLARE @result dbo.SOHOnlineOrderResult
-- CASE OnlineOrderFlag=1
INSERT @result
SELECT SalesOrderID, N'Order placed online by customer'
FROM Sales.SalesOrderHeader_inmem
WHERE OnlineOrderFlag=1
-- ELSE
INSERT @result
SELECT SalesOrderID, N'Order placed by sales person'
FROM Sales.SalesOrderHeader_inmem
WHERE OnlineOrderFlag!=1
-- return single resultset
SELECT SalesOrderID, OrderFlag FROM @result
END
GO
EXEC dbo.usp_SOHOnlineOrderResult
GO
Lihat Juga
Masalah Migrasi untuk Prosedur Tersimpan yang Dikompilasi Secara Asli
Konstruksi Transact-SQL Tidak Didukung oleh OLTP Dalam Memori
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk