我下面有一个SQLCMD(它工作正常),我可以从命令行执行该命令以将SQL数据写入.csv文件。通过将字符串字段转换为由转义双引号引起来的nvarchar(100),我遇到了数据库值内部的逗号问题(破坏了csv分隔),
SQLCMD -s"," -S servername -U username -d databasename -W -o
"mydatafile.csv” -Q "SET NOCOUNT ON
SELECT Account,'""' + cast ([ColDescription] as nvarchar(100)) + '""' as ColumnDescription" FROM myTable
...带转义的双-双引号的列是ColDescription,原始字符串字段实际上有100个字符。因此,这解决了我的问题,但是现在我的数据库值以引号开头遇到了一个新问题。对于那些数据值实际上以引号开头的记录,我假设我想使用3个双引号实例进行转义(这样结果字符串将转义所有的双引号)。
但是,如何告诉SQL转义任意数量的双引号实例?我不知道哪些记录将带有双引号或2个双引号,或者什么。
更好的是,如果数据中存在双引号,我最好在我的.csv文件中显示双引号。所以也许完全逃避他们不是我所需要的。我也不确定我是否正在为这个问题研究正确的词。我想我想逃脱一种字符模式...听起来像是REGEX吗?我以前没有在sql中使用REGEX,而我的直觉告诉我,对于一个似乎很常见的问题来说太复杂了,必须在之前解决。
编辑:我在下面发表评论时还尝试了一种新方法。我将SQLCMD更改为以下内容(尽管这是我的“真实”查询的精简版本)。但是请注意,我使用了Replace函数将所有引号替换为2个引号。我认为,通过使用偶数个引号,它们都将在.csv导出中转义。
SQLCMD -s"," -S servername -U username -d databasename -W -o
"mydatafile.csv” -Q "SET NOCOUNT ON
SELECT Account,'""' + Replace(cast ([ColDescription] as
nvarchar(100)),'"','""') + '""' as ColumnDescription" FROM myTable
...但是现在我在命令提示符下的错误是“意外参数”。我认为“替换”是一个关键字,也许我也需要在Windows中转义...?不过,新的Select语句可以直接在SQL中正常工作。我只是无法执行命令了。
答案 0 :(得分:0)
我终于找到了解决问题的方法。如果我在可能包含特殊字符(例如逗号和双引号)的SQL描述列周围使用QUOTENAME函数,则可以将其导出到CSV文件,并且逗号分隔将正常工作,并且数据字段中的引号也将保留。我的新SQL语句/ SQLCMD语句是:
SQLCMD -s"," -S servername -U username -d databasename -W -o
"mydatafile.csv” -Q "SET NOCOUNT ON
SELECT Account, QUOTENAME(cast ([ColDescription] as nvarchar(100)),'""') as ColumnDescription" FROM myTable
之前我已经阅读过有关QUOTENAME函数的信息,但无法完全正常工作,我在这里找到了使用QUOTENAME的示例:
Exporting CSV data using SQLCMD.EXE
但是我不得不稍稍更改该解决方案(它再次给了我CMD错误,例如“意外参数按?寻求帮助”)。如您在上面看到的,我现在在QUOTENAME函数中使用2个双引号而不是一个双引号。修复了所有问题。