T-Sql
將逗號分隔的值字元串轉換為 XML 後過程提前完成
我有一個在 SSMS 環境中執行得很好的程序,但是當我將它連接到網頁時,沒有看到返回的 packageID 列表,而是返回“null”。我檢查了權限,這似乎不是問題。然後我通過 Profiler 執行該過程,它似乎在“CAST AS XML…CROSS APPLY”語句之後完成,這可以解釋為什麼沒有返回任何內容。我不知道為什麼會這樣。有任何想法嗎?
這是該過程的大部分內容,刪除了一些表變數聲明
DECLARE @allprodsandpacks TABLE ( packageID varchar(20), Name varchar(800), RN tinyint, productID varchar(20) ) INSERT INTO @allprodsandpacks (packageID,Name,RN,productID) SELECT packageID, Name, RN, REPLACE(LTRIM(RTRIM(m.n.value('.[1]','varchar(8000)'))),'|','') AS productID FROM ( SELECT productID as packageID, ROW_NUMBER() OVER (PARTITION BY productlist ORDER BY productID) AS RN, Name, CAST('<XMLRoot><RowData>' + REPLACE(productlist, ',', '</RowData><RowData>') + '</RowData></XMLRoot>' AS XML) AS x FROM TBOnline.dbo.Packages ) AS t CROSS APPLY x.nodes('/XMLRoot/RowData')m(n) --Profiler registers SP:Completed here!! INSERT INTO @prods (productID) SELECT DISTINCT productID FROM @allprodsandpacks WHERE RN > 1 INSERT INTO @packs (packageID,Name) SELECT DISTINCT packageID , Name FROM @allprodsandpacks WHERE productID IN (SELECT productID FROM @prods) SELECT packageID , Name FROM @packs ORDER BY Name
事實證明,問題不在於過程本身,而在於呼叫它的 PHP 函式。在執行之前,我必須包括
mssql_query("SET ANSI_WARNINGS ON"); mssql_query("SET ANSI_PADDING ON"); mssql_query("SET CONCAT_NULL_YIELDS_NULL ON");
在函式中。在程序本身中設置這些沒有效果。
我針對 MS SQL Server 社區的問題被誤導了,但我將把它留在這裡,以防其他人遇到這個問題。