请问有什么方法可以在SQLCMD,SQL Server 2016导出的输出文件的每一列中加上双引号“”,如下所示?
ex.
"TEST1", "TEST2", "TEST3"
"TEST1", "TEST2", "TEST3"
我们想通过S3存储桶为AWS Redshift导出文件。
如果SQLCMD上没有适当的选项,也许我们最好验证一下PowerShell的Invoke-Sqlcmd。 如果您有更好,更简单的方法,那么您的任何建议都会被采纳。
谢谢。
答案 0 :(得分:1)
我认为您必须使用QUOTENAME
函数,因为sqlserver中的双引号仅表示列名
SELECT QUOTENAME(TEST1, '"'), QUOTENAME(TEST2, '"'), QUOTENAME(TEST3, '"')
FROM t
答案 1 :(得分:1)
就F.Y.I.,最后,我为此选择了PowerShell。
Invoke-Sqlcmd -Query $StrQry -ServerInstance $StrSvrName -IgnoreProviderContext | Export-Csv -path $StrExpFile -Encoding UTF8
每个输出文件列都用双引号引起来,这是我的期望。
输出文件包含多余的行,因此在上传到S3存储桶时,我会通过AWS复制命令选项'IGNOREHEADER 2'跳过它们。
谢谢。
答案 2 :(得分:1)
对于下一个想办法解决这个问题的人。我需要从XP_CMDSHELL调用一个批处理文件,该文件调用了SQLCMD,后者从文件中调用了SQL查询。为什么?因为查询是在列名两边加上双引号,并且是动态生成的,所以字段中的逗号数据不会干扰SQLCMD的CSV导出过程。 (以逗号分隔)。就像为引号添加-I一样简单。然后,您可以将双引号查询嵌入到字符串中,或继续从文件中获取。
简单测试:
批处理文件:
sqlcmd -E -S PGCDWDEV02 -d ANALYTICS -I -i D:\extractH\sqlquery.sql -o D:\output.txt
sql文件:
SELECT "TABLE_NAME" FROM INFORMATION_SCHEMA.TABLES
实际交易汇总:
DECLARE @SQLCMD VARCHAR(4000);
SET @SQLCMD
= 'sqlcmd -S ' + @@SERVERNAME + ' -d ' + @db_name + ' -E -I -i ' +
@queryFile + ' -o "' + @root_path + ''
+ @object_name + '.csv" -W -w 10000 -s","';