分析XML文本列时,我的SQL select查询中的结果不正确

分析XML文本列时,我的SQL select查询中的结果不正确,sql,tsql,select,subquery,Sql,Tsql,Select,Subquery,大家好,我有一个表,其中包含我的业务Id,它是varchar(255)数据类型 我还有一个单独的表,当业务得到贷款人的批准时(它存储公司的信息等),它将XML结构化文档存储在文本数据类型列中 我正在尝试返回所有未经贷款人批准的业务ID,唯一可以知道这一点的方法是如果XML中不存在该业务ID。 我不能在任何表上联接,因为我没有任何关系数据,但我正在尝试子查询它 有什么想法吗?这是我的 Select bus_id From dbo.tbl_business Where bus_id Not I

大家好,我有一个表,其中包含我的业务Id,它是varchar(255)数据类型

我还有一个单独的表,当业务得到贷款人的批准时(它存储公司的信息等),它将XML结构化文档存储在文本数据类型列中

我正在尝试返回所有未经贷款人批准的业务ID,唯一可以知道这一点的方法是如果XML中不存在该业务ID。 我不能在任何表上联接,因为我没有任何关系数据,但我正在尝试子查询它

有什么想法吗?这是我的

Select bus_id
From   dbo.tbl_business
Where  bus_id Not In (
                         Select Cast(company_xml_info As Varchar(Max))
                         From   tbl_company_reports
                         Where  Cast(company_xml_info As Varchar(Max)) Is Not Null
                                And company_xml_info Like '%Business id="' + bus_id + '"%'
                                And company_xml_info Is Not Null
                                And company_xml_current_status = 'Approved'
                     )

下面是一个你可以做的类似事情的例子。这在SQL Management Studio 2008及更高版本中应该可以正常运行:

DECLARE @Data TABLE (BusinessId VARCHAR(8))
INSERT INTO @Data (BusinessId) VALUES ('A68'),('A69'),('A70');

DECLARE @CompanyXml TABLE (company_xml_info  VARCHAR(MAX));
INSERT INTO @CompanyXml (company_xml_info ) VALUES ('<CompanyInfo>
 <Businesses>
  <Business id="A68">    
   <Businessceo>Test</Businessceo>  
  </Business>
 </Businesses>
</CompanyInfo>')
,('<CompanyInfo>
 <Businesses>
  <Business id="A70">    
   <Businessceo>Test2</Businessceo>  
  </Business>
 </Businesses>
</CompanyInfo>')

--Data as is
Select *
From @Data

--example of your code as is
SELECT *
From @CompanyXml

--exclusionary listing
SELECT *
From @Data
EXCEPT
--the secret of this is part 1 casting it to xml.  Then you extend that with '.value'.  That wants a structure to get to the Id.  
--I wrap that in ()'s then say the first instance of that [1] as in theory you could have more instances and do very complex parsing.
--Then it needs a type of sql to transform this value into
SELECT CAST(company_xml_info AS XML).value('(CompanyInfo/Businesses/Business/@id)[1]', 'varchar(8)')
From @CompanyXml
DECLARE@Data表(BusinessId VARCHAR(8))
插入@Data(BusinessId)值('A68')、('A69')、('A70');
声明@CompanyXml表(company_xml_info VARCHAR(MAX));
插入@CompanyXml(公司xml\u信息)值('
试验
')
,('
测试2
')
--数据原样
挑选*
来自@Data
--代码原样的示例
挑选*
来自@CompanyXml
--排除性清单
挑选*
来自@Data
除了
--其秘密在于第1部分将其转换为xml。然后用“.value”扩展它。需要一个结构来获取Id。
--我把它包装在()中,然后说[1]的第一个实例,因为在理论上,你可以有更多的实例,并进行非常复杂的解析。
--然后它需要一种sql来将该值转换为
选择CAST(company_xml_info AS xml).value('(CompanyInfo/Business/Business/@id)[1],'varchar(8)')
来自@CompanyXml
更新6-29-17

如果XML的树结构中有重复元素,我更喜欢使用“节点”方法重复它们,这样就不必担心使用第一个。您只需要迭代使用“nodes”语法所获得的内容,并获得如下值

DECLARE @X XML = '<CompanyInfo><Businesses><Business id="C1405"/><Business id="C1408"/><Business id="C1408"/></Businesses> </CompanyInfo>'

SELECT 
  x.query('.')
, x.value('@id', 'varchar(8)')
FROM @X.nodes('/CompanyInfo/Businesses/Business') AS y(x)
DECLARE@xxml=''
挑选
x、 查询('.'))
,x.value(“@id”,“varchar(8)”)
从@X.nodes('/CompanyInfo/Business/Business')开始,作为y(X)

我检索的记录数量与我的业务id相同,您需要提供存储的xml的外观。如果它是合法的XML,我不会将其转换为Varchar(max)。如果您使用的是SQLServer2005或更新版本,我会将其转换为XML,并学习如何正确解析XML。它将比like语句快得多,最终更具可读性。“Test”Cool看到了您的更新,我可以使用它。这很好,但它只搜索找到业务id的第一个xml实例,在我有多个业务节点的整个文档中,如何让it进行搜索,但这是可行的,而且非常棒!!您在示例中只提供了一个,并进行了假设。请提供一个更完整的示例,我可以根据需要进行解析。对不起,先生,这个XML示例如何?我目前正在尝试获取并循环浏览我的文档。您现在给我的不是有效的XML,我将再次做出一些假设,并提供一个更新的示例。