0

我已从 https://stackoverflow.com/a/9714484/1678652获取此功能

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.ini。

如果我将参数硬编码到函数中,我不会得到 php 的结果,我可以更改函数以仅返回参数,因此这不是输入问题。

我想知道这是否相关:

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

解决方案很简单: GRANT EXECUTE ON XML SCHEMA COLLECTION::{XMLSchema1} TO {RestrictedLoginName}

但是这个 XML Schema 集合会被称为什么?在 SSMS 中,我可以浏览 XML Schema 集合类型的对象以向用户添加权限,但没有这种类型的对象。

我已将该功能的所有权限授予用户。

4

1 回答 1

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中被索引;我进行搜索,获取产品 ID 列表,构建这些数字的空格分隔字符串。将此字符串传递给 sql 语句并返回产品表。

于 2013-04-19T13:29:56.747 回答