Sql server SQL Server 2008:从数据库中的值对数据库中的值运行Xquery
我有一个存储多个值的表,我想在Xquery中使用这些值来查找另一个表中与结果匹配的数据。当使用Sql server SQL Server 2008:从数据库中的值对数据库中的值运行Xquery,sql-server,sql-server-2008,stored-procedures,xquery,Sql Server,Sql Server 2008,Stored Procedures,Xquery,我有一个存储多个值的表,我想在Xquery中使用这些值来查找另一个表中与结果匹配的数据。当使用xmlData.Exists(value)进行计算时,Xquery字符串将返回true或false。以下是我到目前为止的情况: 存储过程: ALTER PROCEDURE [XquerySearch] @xquery nvarchar(4000) DECLARE @sqlcmd NVARCHAR(MAX), @SafeXquery NVARCHAR(4000) SET @
xmlData.Exists(value)
进行计算时,Xquery字符串将返回true或false。以下是我到目前为止的情况:
存储过程:
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)
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 ~*****~
以上是我发现的唯一能够使用动态值作为搜索参数(而不是正在搜索的实际字段)运行xquery的方法
好,现在假设我有另一个名为RunQuery
的存储过程,它正在构建一个搜索其他参数的结果集,比如creationDate。我不知道如何使用上面的XquerySearch
存储过程来提供满足我的其他条件和Xquery条件的最终结果集
存储过程:
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)
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
和p.[guid]在@ideaTestingTable
或直接从where子句运行xquery的某种方法中。虽然它可能是最不吸引人的解决方案,但在尝试了许多可能性之后,通过字符串连接构建SQL查询被证明是最快的方法
因此,在我执行Xquery搜索的地方,我为搜索执行字符串连接。这允许使用动态查询运行Xquery,但也允许Xquery仅在已传递其他参数的行上运行,而不是像问题中的第一个存储过程那样扫描整个
数据表。作为一个丑陋的解决方案,我将使用一个函数XQuerySearchGenerateSql,返回select的SQL代码(XquerySearch将只执行此结果)。然后在RunQuery中,我将通过字符串连接构建一个大的select,包括XQuerySearchGenerateSql作为子查询提供的代码“…和(“+XQuerySearchGenerateSql(@XpathQuery)+”)中的p.guid(我没有漂亮的解决方案;-)我可能最终不得不尝试类似的方法,但是我真的很希望有一个解决方案不涉及更多的字符串连接另一个选择可能是让您的过程创建一个表值函数或视图,然后在runQuery中使用这个函数/视图,然后销毁函数/视图(如果可行,这意味着更少的字符串连接)@JBLI最终使用了字符串连接,因为它最终被证明是最快的。如果你把它作为一个答案,我会把它标记为答案,否则我只会回答它,因为有一个答案。你的答案会比任何我会张贴更好。报价和后续行动的Thx:-)