Sql-Server

如何在 sql server 中測試 XML = ‘’?

  • August 17, 2019

我正在使用 sql server 2005,並且遇到了可以在參數中傳遞許多值的情況。

基於此:為一個 SQL 參數傳遞多個值此過程使用 XML 作為參數。

這是儲存過程的程式碼:

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

有關此程序的更多資訊在這裡

這是如何呼叫它的範例:

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

題:

找出參數@ListNoteTypeCode XML是否為空的最佳方法是什麼?

如果他們這樣呼叫這個過程怎麼辦:

declare @p5 int  set @p5=86400 
exec DenormV2.udpProductBulletPointSelectByTier1NoteTypeCode
@Tier1=N'WW099',
@LanguageID=3,
@SeasonItemID=N'16AUT',
@ListNoteTypeCode=N'',
@CacheDuration=@p5 output  select @p5

正如這裡所建議那樣,我可以通過測試參數來完全避免選擇@ListNoteTypeCode

在這種情況下,我的主要目標是以最佳性能檢索數據,因為此過程未記憶體在 Web 伺服器中,並且每天被呼叫超過一百萬次。

您可以檢查NULL節點是否缺失(類型exist方法xml):

@ListNoteTypeCode is NULL OR @ListNoteTypeCode.exist('*') = 0

如有必要,您的 XPath 可以更具體:

@ListNoteTypeCode is NULL OR @ListNoteTypeCode.exist('/BulletPoint/NoteTypeCode/text()') = 0

另一種測試空 XML 參數、變數或列的方法是檢查DATALENGTH. 任何空的 XML 項都應該是 5 個字節。例如:

DECLARE @Test TABLE (XmlParam XML NULL);
INSERT INTO @Test ([XmlParam]) VALUES (NULL), (N''), (N'g');

SELECT t.[XmlParam],
      DATALENGTH(t.[XmlParam]) AS [DATALENGTH],
      CASE (ISNULL(DATALENGTH(t.[XmlParam]), 5))
         WHEN 5 THEN 'EMPTY'
         ELSE 'Not Empty'
      END AS [IsEmpty]
FROM   @Test t;

回報:

XmlParam     DATALENGTH    IsEmpty
--------     ----------    ---------
NULL         NULL          EMPTY
            5             EMPTY
g            9             Not Empty

請注意,我用ISNULL(DATALENGTH(t.[XmlParam]), 5)它來檢查參數或變數應該沒問題。如果檢查列,最好使用XmlColumn IS NULL OR DATALENGTH(XmlColumn) = 5.

另請注意,雖然XML 數據的內部表示可能會在版本之間發生變化,但我已經在 SQL Server 2008 R2、2012 和 2014 上進行了測試,空 XML 項的大小始終為 5。

引用自:https://dba.stackexchange.com/questions/147178