2013-04-19 7 views
0

Я принял эту функцию из https://stackoverflow.com/a/9714484/1678652Отсутствуют разрешения на выполнение XML?

SET @XML = N'<root><r>' + REPLACE(@s, @sep, '</r><r>') + '</r></root>' 

INSERT INTO @result(Id) 
SELECT DISTINCT r.value('.','int') as Item 
FROM @xml.nodes('//root//r') AS RECORDS(r) 

Он принимает строку и расщепляется в таблицу т-й элемент в каждой строке. Он работает, когда я тестирую его в SSMS, но когда я его вызываю из websserver (php/pdo), он возвращает пустой набор результатов.

Я думаю, что это должно быть что-то с разрешениями на XML, потому что если я позволю функции добавлять жестко заданные результаты в таблицу, то я получаю результаты обратно на php.

Если я жестко задал параметры функции, я делаю не получить результат для php, и я могу изменить функцию, чтобы просто вернуть параметры, поэтому это не проблема ввода.

Интересно, если это уместно:

http://beingoyen.blogspot.dk/2009/06/tsql-error-execute-permission-denied-on.html

Решение было простым: GRANT EXECUTE ON XML Schema COLLECTION :: {XMLSchema1} {К} RestrictedLoginName

Но как будет вызываться эта коллекция XML Schema? В SSMS я могу просматривать объекты типа коллекции XML Schema для добавления разрешений пользователю, но нет объектов этого типа.

Я предоставил пользователю все права на эту функцию.

ответ

0

Я должен признать, что я не знаю, в чем разница между этими двумя функциями, но я получил эту функцию из http://www.sqlperformance.com/2012/07/t-sql-queries/split-strings вместо:

ALTER FUNCTION [dbo].[Split] 
(
    @Delimiter NVARCHAR(255), 
    @List  NVARCHAR(MAX) 
) 
RETURNS TABLE 
WITH SCHEMABINDING 
AS 
    RETURN 
    ( 
     SELECT val = y.i.value('(./text())[1]', 'nvarchar(4000)') 
     FROM 
     ( 
     SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') 
      + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i) 
    ); 

Но это работает, как ожидалось :-)

фактическое использование страницы моих продуктов индексируются в mnogosearch; Я делаю поиск, получаю список идентификаторов продукта, строю строку, разделенную пробелом этих чисел. передает эту строку в sql-statement и возвращает таблицу продуктов.