我有以下 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) 我有一个纯文本数据文件,其中包含由不可打印字符"File Separator" (0x1c) 分隔的字段的记录。我正在尝试使用 SQL Server 的 bcp 实用程序将此数据加载到我的数据库中。然而,当使用文件分隔符的十六进制编码值作为 TERMINATOR 时,出现语法错误。
我试过使用
"0x1c"""""这些都不起作用,但是当对可打印字符使用相同的编码时,例如tab,这确实有效:	, 	(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="" 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数据转换为特定模式来搜索特定模式,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) 扩展这个原始问题
我正在使用 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) 我想透视 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 从文件解析为表,同时通过自定义生成的 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 查询的问题,我也找到了解决方案。但我也找到了一些其他的解决方案。所以桌子就像
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 数据,其中
<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) 运行以下查询时,我收到以下错误消息:
无法解决 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 列的数据库。我正在尝试更新(修剪) 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 值
xml ×10
sql-server ×9
xquery ×4
bcp ×1
c# ×1
collation ×1
dynamic-sql ×1
encoding ×1
import ×1
like ×1
permissions ×1
pivot ×1
sql-clr ×1
t-sql ×1
trim ×1