T-Sql

將逗號分隔的值字元串轉換為 XML 後過程提前完成

  • November 18, 2015

我有一個在 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 社區的問題被誤導了,但我將把它留在這裡,以防其他人遇到這個問題。

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