Sql-Server
如何在 sql server 中測試 XML = ‘’?
我正在使用 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。