4

我有一个 XML 文件,我想用它来将静态数据加载到我的数据库中。最好,我想使用 sqlcmd ":r" 进行文本替换,以便在我的 sql 脚本中可以将 xml 视为硬编码数据。

使用硬编码数据,我的脚本可以工作

--Working Code
DECLARE @XML XML
SET @XML = '
<clients>
    <client>
        <ClientNumber>ClientA</ClientNumber>
    </client>
    <client>
        <ClientNumber>ClientB</ClientNumber>
    </client>
</clients>
'

我想做的是这样的:

DECLARE @XML XML
SET @XML = '
:r .\ClientData.xml
'

其中 ClientData.xml 的内容与之前硬编码的 xml 文本相同。问题是 sqlcmd 解析器没有接受测试替换,而只是将值 ':r .\ClientData.xml' 放在我的 xml 变量中。

如果我尝试移除抽动,我会收到以下错误:

Incorrect syntax near '<'.

有什么方法可以强制 sqlcmd 在 tics 内部执行,以便正确替换文本?

4

2 回答 2

8

好的,这是我的黑客...

:setvar XMLDATA "'"

declare @mydata xml = 
$(XMLDATA)
:r "Data.xml"
$(XMLDATA)

基本上只是通过参数化单引号来绕过解析器。

这很难看,但它允许我拥有一个有效的 xml 文件。

于 2013-08-24T06:06:38.583 回答
1

我还没有找到强制命令从字符串内部运行的方法,但一个不错的解决方法是仅引用一个带有引号的 .txt 文件。

客户端数据.txt

'
<clients>
    <client>
        <ClientNumber>ClientA</ClientNumber>
    </client>
    <client>
        <ClientNumber>ClientB</ClientNumber>
    </client>
</clients>
'

脚本.sql

DECLARE @XML XML
SET @XML =
:r .\ClientData.txt
于 2013-07-10T12:23:11.213 回答