Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008:从数据库中的值对数据库中的值运行Xquery_Sql Server_Sql Server 2008_Stored Procedures_Xquery - Fatal编程技术网

Sql server SQL Server 2008:从数据库中的值对数据库中的值运行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 @

我有一个存储多个值的表,我想在Xquery中使用这些值来查找另一个表中与结果匹配的数据。当使用
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:-)