Tsql 将XML与Transact-SQL结合使用

Tsql 将XML与Transact-SQL结合使用,tsql,xml-parsing,sql-server-2008-r2,Tsql,Xml Parsing,Sql Server 2008 R2,我在SQLServer2008R2中工作。我有大约20个数据库,都具有相同的结构。我不完全确定我的代码哪里出错了。如果有人能指出我的错误或给我提供一些关于这个问题的参考资料,我将不胜感激 我正在运行的代码是: create table #temp ([Client] varchar(100), [Language_Code] char(100)) exec sp_msforeachdb ' if ''?'' like ''%'' and exists(select * from ?.sys.

我在SQLServer2008R2中工作。我有大约20个数据库,都具有相同的结构。我不完全确定我的代码哪里出错了。如果有人能指出我的错误或给我提供一些关于这个问题的参考资料,我将不胜感激

我正在运行的代码是:

create table #temp 
([Client] varchar(100), [Language_Code] char(100))

exec sp_msforeachdb '
if ''?'' like ''%'' and exists(select * from ?.sys.tables t where t.name =  ''LicenceInfoes'')
begin
DECLARE @MyXML XML
Declare @lang_code char(100)

set @lang_code = ''(SELECT a.b.value''(''Laguages[1]'',''char(100)'')'' FROM @MyXML.nodes(''Licence'') a(b))''
insert into #temp select ''?'', @lang_code  
end
'

select * from #temp

drop table #temp
最终结果是出现以下错误:

味精102,第15级,状态1,第7行
“语言[1]”附近的语法不正确

所需的输出将是一个包含两列的表,如下所示:

<DB_Name> <Language_Codes>
  Name1      en-GB, en-US 
create table Tbl (Client varchar(max), Language_Code varchar(max))
exec sp_msforeachdb '
    if ''?'' like ''%'' and exists(select * from ?.sys.tables t where t.name =  ''LicenceInfoes'')

begin
SET QUOTED_IDENTIFIER ON

INSERT INTO Tbl

SELECT
    ''?'', 
    a.b.value(''(.)[1]'',''varchar(100)'') AS Language_Codes 
FROM ?..LicenceInfoes 
cross apply LicenceData.nodes(''/Licence/Laguages/Language'') a(b)
end'

select * from Tbl

drop table Tbl
以及存储在其中一个数据库中的示例XML

<Licence xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Clients />
  <LastUpdated>2014-06-03T15:59:46.9831585Z</LastUpdated>
  <CustomerId>9999999</CustomerId>
  <CustomerName>xxxxx</CustomerName>
  <ContactEmail>someone@somewhere.com</ContactEmail>
  <Type>Commercial</Type>
  <Languages>
    <Language>en-GB</Language>
    <Language>en-US</Language>
  </Languages>
  <DefaultLanguagePack>en-GB</DefaultLanguagePack>
将t.licenseinfoes更改为?.licenseinfoes修复了我遇到的问题。

这有帮助吗

DECLARE @Tbl TABLE (ID INT NOT NULL, XmlContent XML)

INSERT INTO @tbl VALUES(1, '<Licence xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Clients />
  <LastUpdated>2014-06-03T15:59:46.9831585Z</LastUpdated>
  <CustomerId>9999999</CustomerId>
  <CustomerName>xxxxx</CustomerName>
  <ContactEmail>someone@somewhere.com</ContactEmail>
  <Type>Commercial</Type>
  <Languages>
    <Language>en-GB</Language>
    <Language>en-US</Language>
  </Languages>
  <DefaultLanguagePack>en-GB</DefaultLanguagePack></Licence>')

SELECT
    ID,
    XT.XC.value('(.)[1]', 'varchar(50)')
FROM 
    @Tbl
CROSS APPLY
    XmlContent.nodes('/Licence/Languages/Language') AS XT(XC)

我想这可能会有帮助

exec sp_msforeachdb '
if ''?'' like ''%'' and exists(select * from ?.sys.tables t where t.name =  ''LicenceInfoes'')
begin
DECLARE @MyXML XML
Declare @lang_code char(100)
SET @MyXML = (select LicenceData from t.LicenceInfoes)
set @lang_code = (SELECT a.b.value(''Laguages[1]'',''char(100)'') FROM @MyXML.nodes(''Licence'') a(b))
insert into #temp select ''?'', @lang_code  
end'

我不明白
如果“?”像“%”
的意思,但是现在,查询在语法上是正确的。

我相信您的错误是由于第7行的
语言[1]
拼写错误造成的。将其更改为
语言[1]
,它应该会产生正确的输出。

在尝试了一些选项后,我出现了以下错误:

Msg 208, Level 16, State 1, Line 7
Invalid object name 'LicenceInfoes'.
我意识到我在设置@MyXML变量的代码部分犯了一个错误

它是:

SET @MyXML = (select LicenceData from LicenceInfoes)
在表名之前添加“?…”将其修复

SET @MyXML = (select LicenceData from ?..LicenceInfoes)
多亏了marc_,我最终更新了代码。现在看起来是这样的:

<DB_Name> <Language_Codes>
  Name1      en-GB, en-US 
create table Tbl (Client varchar(max), Language_Code varchar(max))
exec sp_msforeachdb '
    if ''?'' like ''%'' and exists(select * from ?.sys.tables t where t.name =  ''LicenceInfoes'')

begin
SET QUOTED_IDENTIFIER ON

INSERT INTO Tbl

SELECT
    ''?'', 
    a.b.value(''(.)[1]'',''varchar(100)'') AS Language_Codes 
FROM ?..LicenceInfoes 
cross apply LicenceData.nodes(''/Licence/Laguages/Language'') a(b)
end'

select * from Tbl

drop table Tbl
它的输出与marc_s在他的例子中的输出完全相同,这就是我想要的


谢谢大家的回复和帮助

示例XML已自动更正为显示的内容。应该是这样的。我尝试了一下,结果如下:Col1:DB_Name Col2:(从@MyXML.nodes('license')a(b))@user3753561中选择a.b.value('Laguages[1],'char(100)),我看不到结果,但我已经更新了帖子。这一切正常。我需要查找存储在LicenseInfoes表列中的数据。我尝试添加一个select语句来替换xml数据,结果得到一个空表作为输出。xml对于所有数据库都具有相同的结构,但随着语言的添加或删除,xml可能会有所不同。
create table Tbl (Client varchar(max), Language_Code varchar(max))
exec sp_msforeachdb '
    if ''?'' like ''%'' and exists(select * from ?.sys.tables t where t.name =  ''LicenceInfoes'')

begin
SET QUOTED_IDENTIFIER ON

INSERT INTO Tbl

SELECT
    ''?'', 
    a.b.value(''(.)[1]'',''varchar(100)'') AS Language_Codes 
FROM ?..LicenceInfoes 
cross apply LicenceData.nodes(''/Licence/Laguages/Language'') a(b)
end'

select * from Tbl

drop table Tbl