Процедура 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, был ошибочным, но я оставлю его здесь на случай, если у кого-то еще возникнет эта проблема.