Процедура SQL Server завершается преждевременно после преобразования строк с разделителями-запятыми в XML

У меня есть процедура, которая прекрасно выполняется в среде SSMS, но когда я подключаю ее к веб-странице, вместо того, чтобы увидеть возвращенный список packageID, возвращаемое значение равно нулю. Я проверил разрешения, но это не проблема. Затем я запустил процедуру через Profiler, и она, казалось, завершилась после оператора "CAST AS XML...CROSS APPLY", который объясняет, почему ничего не возвращается. Я не могу понять, почему это было бы все же. Есть идеи?

Вот полная процедура

SET NOCOUNT ON

--get EVERY product in EVERY package
DECLARE @allprodsandpacks TABLE (
      packageID varchar(20),
      Name varchar(800),
      RN tinyint,
      productID varchar(20)
)


--list products in more than one package
DECLARE @prods TABLE (
      productID varchar(20),
      packages varchar(800)
)

--list packages with a 'shared' product
DECLARE @packs TABLE (
      packageID varchar(20),
      Name varchar(200),
      products varchar(800)
)



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

1 ответ

Решение

Оказывается, проблема была не в самой процедуре, а в вызывающей ее функции PHP. До исполнения я должен был включить

        mssql_query("SET ANSI_WARNINGS ON");
        mssql_query("SET ANSI_PADDING ON");
        mssql_query("SET CONCAT_NULL_YIELDS_NULL ON");

в функции. Установка их в самой процедуре не имела никакого эффекта.

Мой вопрос, адресованный сообществу MS SQL Server, был ошибочным, но я оставлю его здесь на случай, если у кого-то еще возникнет эта проблема.

Другие вопросы по тегам