Используйте findstr для замены пустых значений пустыми строками из команды sqlcmd - PullRequest
2 голосов
/ 12 июня 2019

У меня есть команда sqlcmd, которая генерирует CSV-файл из представления. Можно ли заменить значения NULL пустой строкой с помощью команды findstr?

Вот что я попробовал.

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"

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Вы можете легко построить 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 вы можете уменьшить приведенный выше код - например, используя IIF или STRING_AGG .

Кроме того, вы можете добавить предложение WHERE, чтобы отфильтровать запрос для определенных представлений.

0 голосов
/ 12 июня 2019

Измените sql в командной строке, чтобы выбрать поля по отдельности и сделать ISNULL для них

select * from view_Table

На

select  ISNULL([FIELD_1],''''),ISNULL([FIELD_2],'''') from view_Table

в вызывающей строке

useследующий код для его сборки и проверки, чтобы увидеть последний оператор выполняется

DECLARE @Temp VARCHAR(MAX)
SET @Temp = 'SELECT  ISNULL([FIELD_1],''''),ISNULL([FIELD_2],'''') FROM view_Table'
SELECT @Temp
...