标签: xml

带有 XML 参数的 CLR 过程返回根级别的数据无效。线路 1,位置 1

我有以下 CLR 存储过程,该过程在此命令上引发错误

xmlDoc.LoadXml(inputXml);
Run Code Online (Sandbox Code Playgroud)

代码

    public static int spGetTaxOfficeXML(SqlXml _inputXml)
    {
        // this procedure rename Row elements name with NodeName attribute value
        string inputXml = _inputXml.ToString();
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(inputXml);

// procedure Logic

        SqlContext.Pipe.Send(inputXml);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

当 XML 文本作为文本位于 Visual Studio 内的变量内部时,效果很好。但是当我将代码作为 CLR 上传到 SQL Server 并尝试从 SQL Management Studio 执行它时:

DECLARE @XML XML
SET @XML = '<NodeA><NodeB></NodeB><NodeC AttributeX=""><Row NodeName="RowA" AttributeA="" AttributeB="abcd" AttributeC="efgh" /><Row NodeName="RowB" AttributeA="wxyz" /><Row NodeName="RowC" AttributeB="qwer" AttributeC="tyui" /><Row NodeName="RowD" AttributeA="stuv" AttributeB="erty" AttributeC="fghj" /></NodeC></NodeA>'

EXEC …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 xml sql-server c# sql-clr

3
推荐指数
1
解决办法
2073
查看次数

在 SQL Server BCP xml 格式文件中使用不可打印的字符作为 TERMINATOR

我有一个纯文本数据文件,其中包含由不可打印字符"File Separator" (0x1c) 分隔的字段的记录。我正在尝试使用 SQL Server 的 bcp 实用程序将此数据加载到我的数据库中。然而,当使用文件分隔符的十六进制编码值作为 TERMINATOR 时,出现语法错误。

我试过使用

  • 十六进制编码值: "0x1c"
  • XML 编码值作为十六进制: "&#x1c;"
  • XML 编码值作为十进制: "&#28;"

这些都不起作用,但是当对可打印字符使用相同的编码时,例如tab,这确实有效:&#x09;, &#9;(0x9没有。不足为奇,因为这是一个 XML 文件。)

结论似乎是不支持不可打印的字符。是这种情况吗?这将是具有讽刺意味的,因为不可打印的分隔符正是为此目的而创建的......

您可以在下面找到重现此问题的所有代码:

XML 格式文件:test.xml

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="&#x1c;" MAX_LENGTH="10" COLLATION="Latin1_General_CS_AS_WS"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="41"/>
 </RECORD>
 <ROW>
  <COLUMN SOURCE="1" NAME="COL1" xsi:type="SQLVARYCHAR"/>
  <COLUMN SOURCE="2" NAME="COL2" xsi:type="SQLNUMERIC" PRECISION="4" SCALE="0"/>
 </ROW>
</BCPFORMAT>
Run Code Online (Sandbox Code Playgroud)

数据文件:test.txt
这只是一行,作为一个测试用例。StackExchange 不会在下面的行中显示分隔符,但是当您单击此帖子的“编辑”时,分隔符已包含在内,您应该能够复制粘贴它。

1111111112008
Run Code Online (Sandbox Code Playgroud)

命令行

bcp TEST_DB.dbo.UL_TEST in "test.txt" -T -f "test.xml"
Run Code Online (Sandbox Code Playgroud)

xml sql-server bcp encoding

3
推荐指数
1
解决办法
1268
查看次数

T-SQL LIKE 谓词无法与 XML 转换的 varchar 中的空格匹配

最近,我尝试通过将XML数据转换为特定模式来搜索特定模式,varchar(max)尽管我知道这不是最佳实践,并且发现它没有按预期工作:-

设置

declare @container table(
    [Response] xml not null
);

declare @xml xml =
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://abc.com/xsd" xmlns:ns="http://abc.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Header>
     <ns:MessageHeader>
       <xsd:ID>ABC</xsd:ID>
       <xsd:Date>2018-12-31T23:59:59</xsd:Date>
     </ns:MessageHeader>
   </soapenv:Header>
   <soapenv:Body>
     <ns:MessageResponse>
       <ns:return>
         <xsd:ResponseList xsi:nil="true" />
       </ns:return>
     </ns:MessageResponse>
   </soapenv:Body>
 </soapenv:Envelope>';

insert into @container values (@xml);
Run Code Online (Sandbox Code Playgroud)

此查询有效

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true"%';
Run Code Online (Sandbox Code Playgroud)

注意通配符在 XML 节点之前的3 个字符(即结束' />'

但这不是

select *
  from @container
 where cast(Response as varchar(max))
  like '%<xsd:ResponseList xsi:nil="true" %' -- …
Run Code Online (Sandbox Code Playgroud)

xml sql-server t-sql like string-searching

3
推荐指数
1
解决办法
288
查看次数

ms sql 查询多个表列作为相同的标签(续集)

扩展这个原始问题

我正在使用 SQL Server Express 2017

假装这是我的源表:

+-------------+---------------------------+
| ID | Name   | Age  | HairColor | HasCar |
+-------------+---------------------------+
| 1  | Bert   | 25   | blonde    | 1      |
| 2  | Agnes  | 61   | white     | 0      |
| 3  | Diane  | 43   | brunette  | 1      |
+-------------+---------------------------+
Run Code Online (Sandbox Code Playgroud)

如何得到这样的结果?

<MyRootElement>
    <MyGroupingTag Group="1">
      <MyTag Value="1"      />
      <MyTag Value="Bert"   />    
      <MyTag Value="25"     />
      <MyTag Value="blonde" />
      <MyTag Value="1"      />
    </MyGroupingTag>
    <MyGroupingTag Group="2">
      <MyTag Value="2"        /> …
Run Code Online (Sandbox Code Playgroud)

xml sql-server

3
推荐指数
1
解决办法
67
查看次数

使用 XQuery 正确旋转 XML 列

我想透视 SQL XML 列的属性和值,并以有序的列和行格式显示它。

首先,这是 XML 列在 SQL 中的样子:

<Model xmlns:dsc="ModelDescriptive" xmlns:draw="ModelDraw" xmlns:display="Display" xmlns:thd="Model3D">
  <dsc:Model name="15DE">
    <dsc:Defs>
      <dsc:Materials>
        <dsc:Material ref="E-HD-AnoAno" baseRef="E-HD" type="rod" productionGroup="OPTION" />
        <dsc:Material ref="E-3L44A-CLEAR" baseRef="E-3L44A" type="piece" productionGroup="OPTION" />
        <dsc:Material ref="R-TH01" baseRef="R-TH-TH" type="rod" productionGroup="ASSEMBLY" />
        <dsc:Material ref="M-TH05" baseRef="M-TH" type="meter" productionGroup="MOLDING" />
      </dsc:Materials>
    </dsc:Defs>
  </dsc:Model>
</Model>
Run Code Online (Sandbox Code Playgroud)

...这是我的查询:

 SELECT
      x.y.value('local-name(..)', 'VARCHAR(MAX)') ParentElementName
     ,x.y.value('local-name(.)', 'VARCHAR(MAX)') Attribut
     ,x.y.value('.', 'VARCHAR(MAX)') Value
     ,Row_number() Over(Partition by x.y.value('local-name(..)', 'VARCHAR(MAX)') order by x.y.value('local-name(..)', 'VARCHAR(MAX)') ASC)  as rn
 FROM @xmlDescriptive.nodes('//*[text()], //@*') AS x(y)
 WHERE x.y.value('local-name(..)', 'VARCHAR(MAX)')= 'Material'
 ORDER BY …
Run Code Online (Sandbox Code Playgroud)

xml pivot xquery sql-server-2014

3
推荐指数
1
解决办法
73
查看次数

在创建具有关系的 ID 时导入 XML 数据

我需要将 XML 从文件解析为表,同时通过自定义生成的 ID 值保留它们的关系。

例如,如果我有以下 XML:

<root>
   <construction>
      <constructionName>randomname1</constructionName>
      <project>
         <projectname>another randomname</projectname>
         <businesspartners>
            <partnername>bilbo bagginses</partnername>
         </businesspartners>
         <employees>
            <employee>
               <empname>frodo</empname>
               <empaddress>etc...</empaddress>
            </employee>
         </employees>
      </project>
      <info>
         <randElement></randElement>
      </info>
      <constructionType>houses</constructiontype>
   </construction>
   <construction>
      <...(etc, same as above, times n^10)/>
   </construction>
</root>
Run Code Online (Sandbox Code Playgroud)

由此,我需要生成到下表的数据:

CONSTRUCTION (CONSTRUCTION_ID INT PRIMARY KEY
   , CONSTRUCTIONNAME VARCHAR..
   , CONSTRUCTIONTYPE VARCHAR.. )

PROJECT (PROJECT_ID INT PRIMARY KEY
   , CONSTRUCTION_ID INT FOREIGN KEY REFERENCES CONSTRUCTION
   , PROJECTNAME VARCHAR.., )


BUSINESSPARTNERS (BUSINESSPARTNERS_ID INT PRIMARY KEY
   , PROJECT_ID INT FOREIGN KEY REFERENCES PROJECT
   , …
Run Code Online (Sandbox Code Playgroud)

xml sql-server import

2
推荐指数
1
解决办法
2289
查看次数

带有不区分大小写标记的 XML 查询 - 这是最好的查询

我之前问过有关不区分大小写标记的 XML 查询的问题,我也找到了解决方案。但我也找到了一些其他的解决方案。所以桌子就像

DECLARE @myTable TABLE ( yourXML XML )  

INSERT INTO @myTable SELECT '<z><a><b>1</b><c>2</c></a></z>'
INSERT INTO @myTable SELECT '<Z><A><b>1</b><c>2</c></A></Z>' 
Run Code Online (Sandbox Code Playgroud)

以下所有解决方案都返回我想要的(不区分大小写的标签)

-----Solution 1----------

SELECT * FROM @myTable WHERE ( [yourXML].exist('for $x in /*[lower-case(local-name(.)) = "z"]/*[lower-case(local-name(.)) = "a"] where  ( ($x/*[lower-case(local-name(.)) = "b"][1]) = 1 )  return $x')>0 ) 

-------------------------
-----Solution 2----------

SELECT * FROM @myTable
WHERE
(CONVERT(XML,LOWER(CONVERT(VARCHAR(MAX),[yourXML]))).exist('for $x in /z/a where  ( ($x/b[1]) = 1 )  return $x')>0 )

-------------------------
-----Solution 3----------

SELECT * FROM @myTable WHERE 
([yourXML].exist('for …
Run Code Online (Sandbox Code Playgroud)

xml sql-server sql-server-2008-r2 xquery

2
推荐指数
1
解决办法
1555
查看次数

可以优化涉及 XQuery 函数的 SELECT 查询,该查询从具有任意数量子元素的元素中选择

假设我有以下 XML 数据,其中

  • <root>可以有任意数量的<child>孩子
  • <child>可以有任意数量的<grandchild>孩子
  • <grandchild>可以有任意数量的<greatgrandchild>孩子
  • <child>并且<grandchild>可以有任意数量的<parameter>孩子
  • 每个人<parameter>都有<name>一个<value>孩子
  • 深度停在曾孙(不需要任意深度)

例如,

<root name="root">
  <child name="a">
    <grandchild name="a1">
      <parameter>
        <name>param1</name>
        <value>ABC123</value>
      </parameter>
      <parameter>
        <name>param2</name>
        <value>CBC</value>
      </parameter>
      <greatgrandchild name="a1a">
        <parameter>
          <name>paramA</name>
          <value>ABC</value>
        </parameter>
        <parameter>
          <name>paramB</name>
          <value>DBC</value>
        </parameter>
      </greatgrandchild>
    </grandchild>
  </child>
</root>
Run Code Online (Sandbox Code Playgroud)

我需要做的是选择包含“_BC”的值的参数,其中 _ 是一个不是 A 的字符。

我有以下查询

SELECT
    TestId,
    [root],
    child,
    grandchild,
    NULL AS greatgrandchild,
    parameter
FROM (
        SELECT
            TestId,
            [root].a.value('@name', 'varchar(max)') AS …
Run Code Online (Sandbox Code Playgroud)

xml sql-server sql-server-2012 xquery

2
推荐指数
1
解决办法
1321
查看次数

运行动态 sql FOR XML PATH 时的排序规则冲突

运行以下查询时,我收到以下错误消息:

无法解决 equal to 操作中“Latin1_General_CI_AS”和“Latin1_General_BIN”之间的排序冲突

此查询工作正常,基本上为我提供了在当前数据库中创建用户的脚本。

为了在当前服务器中的所有(或选择)数据库中运行查询,我通过动态 SQL 和 XML PATH 完成了它。

问题是,当我取消注释下面脚本的 XML 部分时,出现上面的错误。

我不是在所有服务器中都收到此错误。有些服务器工作正常,有些则陷入困境。

我希望此查询可以在所有服务器中运行,而与服务器排序规则无关。

我怎样才能做到这一点?

DECLARE @sql NVARCHAR(MAX)
DECLARE @ParamDefinition NVARCHAR(MAX)

    DECLARE  @log NVARCHAR(MAX)
            ,@vCrlf CHAR(2);

    SELECT  @log = ''
           ,@vCrlf = CHAR(13)+CHAR(10);



SELECT @SQL = '
--==========================================
-- creating the users
--==========================================

select  db = db_name(),
         _login=[master].[sys].[server_principals].[name],
         role_= null,
         obj=null,
        Permission= null,
        [script]=
''CREATE USER [''       
 + [sys].[database_principals].[name] + '']'' + '' FOR LOGIN ['' + [master].[sys].[server_principals].[name] + '']'' 

from [sys].[database_principals] INNER JOIN [master].[sys].[server_principals]
on [sys].[database_principals].[name]=[master].[sys].[server_principals].[name] …
Run Code Online (Sandbox Code Playgroud)

xml sql-server collation permissions dynamic-sql

2
推荐指数
1
解决办法
2392
查看次数

修剪 MS SQL Server 中 xml 列中的值

我有一个带有 XML 列的数据库。我正在尝试更新(修剪) xml 列的 xml 值。我在 Windows、SQL Server 2008 Express 上运行。

我没有找到任何直接在 Xquery 中修剪的方法,所以我尝试通过选择该值。这是 SQL

select RTRIM(LTRIM(col2.value('(/Root/Row/Rowid/text())[1]','varchar(20)')))
from   dbo.T1
Run Code Online (Sandbox Code Playgroud)

但是现在我不知道如何更新这个 xml 值。

有没有办法直接修剪xml值?如果不是,我该如何修剪价值?

我不是要更新表中的单行,而是要修剪表中所有行的 xml 值

sql-server-2008 xml sql-server xquery trim

2
推荐指数
1
解决办法
2345
查看次数