【问题标题】:Append Quotes for all VARCHAR Columns when exporting to csv file导出到 csv 文件时为所有 VARCHAR 列附加引号
【发布时间】:2023-04-03 12:25:01
【问题描述】:

我有一个存储过程,它在运行时会给出一个表格输出。我想将此过程导出到 csv 文件,但想为所有数据类型为 CHAR/VARCHAR 的列附加双引号/单引号。

例如:

存储过程 O/P:

ID    Name    Address                  SSN
1      abd    9301,LeeHwy, 22031       64279100

CSV 文件中的输出:

 1,"abd","9301,LeeHwy, 22031",64279100

谁能帮助我了解如何使用 BAT 文件来执行该过程并生成此 csv 文件。

【问题讨论】:

  • 快速而肮脏的方式,创建一个视图并用 '"' + fieldname + '"' 包装你的 varchar 字段
  • @Rogala:这绝对是一种方式。但是我有 62 列,其中大约 40 列是 VARCHAR 列。所以寻找一种我可以自动化它的方法。
  • 您可以获取表模式,然后遍历记录以定位 varchar 列。将脚本存储在局部变量中,然后使用 EXEC @script 执行脚本。我已经为其他解决方案这样做了,效果很好!
  • 我下面的回答对你有用吗?

标签: sql sql-server csv export-to-csv autosys


【解决方案1】:

执行此操作的一种方法是循环遍历表模式以提取 varchar 列。我已经对我的一张桌子进行了测试,它确实有效:

DECLARE @tableName VARCHAR(Max) = '[Put your table name here]';
DECLARE @currColumns VARCHAR(Max) = NULL;

SELECT @currColumns = COALESCE(@currColumns + ',' 
    + CASE WHEN t.Name  = 'varchar' THEN '''"'' + ' ELSE '' END 
    + '[', '[') + c.name + ']' 
    + CASE WHEN t.Name = 'varchar' THEN '+ ''"''' ELSE '' END
    + ' as [' + c.name + ']'
FROM    
    sys.columns c
INNER JOIN 
    sys.types t ON c.user_type_id = t.user_type_id
WHERE
    c.object_id = OBJECT_ID(@tableName)

EXEC('SELECT ' + @currColumns + ' FROM ' + @tableName);

这是一种快速而肮脏的方式。

更新(评论): 插入表格非常容易。只需这样做:

INSERT INTO [TABLE]
EXEC('SELECT ' + @currColumns + ' FROM ' + @tableName);

【讨论】:

  • 代码似乎不起作用。在第一个 select 语句中,我不知道我们从哪里得到 t.name 和 c.name
  • 谢谢罗加拉。上面的代码有效,但问题是如果第一列是 VARCHAR。它在第一列值的末尾附加引号,但不在开头附加引号。
  • 你知道如何将 EXEC(SQL QUERY) 插入临时表吗?
  • 已更新,您也可以在脚本本身中执行此操作,然后在脚本中处理临时表
【解决方案2】:

我找到了解决问题的方法。 感谢@Rogala(对问题给出初步答案的开发人员)触发了使用系统表的想法。

代码如下:

DECLARE @tableName VARCHAR(Max) = '[Put your table name here]';
DECLARE @currColumns VARCHAR(Max) = NULL;
Declare @Delim CHAR(5)='''"''+'

SELECT @currColumns = COALESCE(@currColumns + ','+ CASE WHEN DATA_TYPE= 'varchar' THEN '''"'' + ' ELSE '' END + '[', '[') + COLUMN_NAME + ']'
                    + CASE WHEN DATA_TYPE = 'varchar' THEN '+ ''"''' ELSE '' END + ' as [' + COLUMN_NAME + ']' 
FROM INFORMATION_SCHEMA.Columns
WHERE  table_name = @tableName 

Set @currColumns= @Delim+@currColumns

EXEC('SELECT ' + @currColumns + ' FROM ' + @tableName);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2021-01-22
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多