0

我有一个存储多个值的表,我想在 Xquery 中使用这些值在另一个表中查找与结果匹配的数据。Xquery 字符串被构建为在使用 评估时返回真或假xmlData.Exists(value)。这是我到目前为止所拥有的:

存储过程:

ALTER PROCEDURE [XquerySearch] 
@xquery nvarchar(4000)    

DECLARE 
    @sqlcmd NVARCHAR(MAX),
    @SafeXquery NVARCHAR(4000)

SET @SafeXquery = REPLACE(@xquery, '''', '''''')

SET @sqlcmd = N'SELECT d.[guid], p.pGuid, 
    FROM Data AS d
    LEFT OUTER JOIN PDataLink as p on d.[guid] = p.pGuid
    WHERE d.xmlData.exist(''' + @SafeXquery + ''') = 1';
exec (@sqlcmd)

以上是我发现能够使用动态值作为搜索参数(不是正在搜索的实际字段)运行 xquery 的唯一方法。

好的,现在假设我有另一个名为 的存储过程RunQuery,它正在构建一个搜索其他参数的结果集,例如creationDate。我不知道如何使用XquerySearch上面的存储过程来提供满足我的其他条件和 Xquery 条件的最终结果集。

存储过程:

ALTER PROCEDURE [RunQuery] 
@queryid int

DECLARE @ideaTestingTable table ( pGuid uniqueidentifier)
~*****~

SELECT Distinct p.guid
FROM Parent p
LEFT OUTER JOIN PDataLink pdl ON p.[guid] = pdl.pGuid
LEFT OUTER JOIN Data d ON pdl.dataGuid = d.[guid]
CROSS JOIN QueryParams q
WHERE q.id = @queryid
AND ~My other search parameters are true~
AND ~*****~

~ * **** ~ = 我怎样才能建立一个临时表,其中有一个pGuid匹配的列表d.xmlData(可能调用 XquerySearch 存储过程)然后添加where到底部AND p.[guid] IN @ideaTestingTable或以某种方式运行 xquery直接来自 where 子句。

4

1 回答 1

0

虽然它可能是最不吸引人的解决方案,但在尝试了许多可能性之后,通过字符串连接构建 SQL 查询被证明是最快的方法。

因此,在我进行 Xquery 搜索的地方,我对搜索进行字符串连接。这允许 Xquery 与动态查询一起运行,但也允许 Xquery 仅在已经传递其他参数的行上运行,而不是像问题中的第一个存储过程那样扫描整个Data表。

于 2013-10-29T17:38:38.517 回答