首页 > 解决方案 > 使用 findstr 将空值替换为 sqlcmd 命令中的空字符串

问题描述

我有一个 sqlcmd 命令,它从视图中生成一个 csv 文件。是否可以使用 findstr 命令将 NULL 值替换为空字符串?

这是我尝试过的。

sqlcmd -S . -d SAMPLEDB -U sa -P pass -s"|" -W -Q "SET NOCOUNT ON SET ANSI_WARNINGS OFF select * from view_Table" > Sample.csv -h -1 | findstr /v /c:"NULL"

标签: sql-servertsqlcmdsqlcmd

解决方案


您可以使用系统管理视图轻松构建extraction SQL每个视图。这个简单的查询:

SELECT v.[name]
      ,c.[name]
      ,c.[column_id]
      ,c.[is_nullable]
FROM sys.views V
INNER JOIN sys.columns C
    ON V.[object_id] = C.[object_id];

将返回我们执行任务所需的一切:

  • 视图名称
  • 列名
  • 列顺序
  • 如果该列可以为空

因此,我们只需要构建提取 SQL 语句:

SELECT v.[name]
      ,'SELECT ' + DS.[definition] + ' FROM ' + v.[name]
FROM sys.views V
CROSS APPLY
(
    SELECT STUFF
    (
        (
            SELECT ',' + CASE WHEN c.[is_nullable] = 1 THEN 'ISNULL(' + c.[name] + ','''')' ELSE c.[name] END
            FROM sys.columns C
            WHERE V.[object_id] = C.[object_id]
            ORDER BY c.[column_id]
            FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)')
        ,1
        ,1
        ,''
    )
) DS ([definition]);

根据您的 SQL 版本,您可以减少上面的代码 - 例如使用IIFSTRING_AGG

此外,您可以添加WHERE子句来过滤特定视图的查询。


推荐阅读