Tôi đang làm việc với máy chủ sql 2005 và tôi đã gặp tình huống có thể truyền nhiều giá trị trong một tham số.
Dựa trên điều này: Truyền nhiều giá trị cho một tham số SQL , quy trình này sử dụng XML làm tham số.
đây là mã của thủ tục được lưu trữ:
CREATE PROCEDURE [DENORMV2].[udpProductBulletPointSelectByTier1NoteTypeCode] (  
    @Tier1 VARCHAR(10),  
    @LanguageID INT,  
    @SeasonItemID VARCHAR(5) = NULL,
    @ListNoteTypeCode XML,  
    @CacheDuration INT OUTPUT )  
    WITH EXECUTE AS 'webUserWithRW'  
AS
        SELECT  pbp.Tier1, pbp.LanguageId, pbp.NoteText, pbp.NoteTypeCode,  
                pbp.NoteGroup, pbp.SortOrder  
        FROM    dbo.ProductBulletPoint pbp  
        WHERE   Tier1 = @Tier1 
          AND   LanguageId = @LanguageID 
          AND   (      SeasonItemId = @SeasonItemID  
                  OR
                       @SeasonItemID is null
                )
          AND pbp.NoteTypeCode IN (
                 SELECT  NoteTypeCode=BulletPoint.NoteTypeCode.value('./text()[1]', 'varchar(50)')
                   FROM  @ListNoteTypeCode.nodes('/BulletPoint/NoteTypeCode') AS BulletPoint ( NoteTypeCode )
          )
SELECT  @CacheDuration = Duration  
FROM    dbo.CacheDuration  
WHERE   [Key] = 'Product'
GO
Thông tin thêm về thủ tục này tại đây
đây là một ví dụ về cách nó có thể được gọi là:
declare @p5 int  set @p5=86400 
exec DenormV2.udpProductBulletPointSelectByTier1NoteTypeCode
@Tier1=N'WW099',
@LanguageID=3,
@SeasonItemID=N'16AUT',
@ListNoteTypeCode=N'<BulletPoint><NoteTypeCode>GarmentComposition</NoteTypeCode><NoteTypeCode>FootwearAccessoryComposition</NoteTypeCode></BulletPoint>',
@CacheDuration=@p5 output  select @p5
Câu hỏi:
cách tốt nhất để tìm hiểu xem tham số @ListNoteTypeCode XMLcó trống hay không?
Điều gì xảy ra nếu họ gọi thủ tục này như thế này:
declare @p5 int  set @p5=86400 
exec DenormV2.udpProductBulletPointSelectByTier1NoteTypeCode
@Tier1=N'WW099',
@LanguageID=3,
@SeasonItemID=N'16AUT',
@ListNoteTypeCode=N'',
@CacheDuration=@p5 output  select @p5
như đã đề xuất ở đây tôi có thể tránh việc chọn hoàn toàn bằng cách kiểm tra tham số @ListNoteTypeCode.
Mục tiêu chính của tôi trong kịch bản này là lấy dữ liệu với hiệu suất tốt nhất có thể, vì quy trình này không được lưu trong bộ máy chủ web và được gọi hơn một triệu lần mỗi ngày.