У меня есть команда 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"
Вы можете легко создать 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 вы можете уменьшить приведенный выше код, например, используя ИИФ или STRING_AGG.
Кроме того, вы можете добавить предложение WHERE
, чтобы отфильтровать запрос для определенных представлений.
Измените sql в командной строке, чтобы выбрать поля по отдельности и выполнить для них ISNULL.
select * from view_Table
К
select ISNULL([FIELD_1],''''),ISNULL([FIELD_2],'''') from view_Table
в тебе вызывающая строка
используйте следующий код, чтобы построить его, и проверьте, чтобы увидеть, как работает окончательный оператор.
DECLARE @Temp VARCHAR(MAX)
SET @Temp = 'SELECT ISNULL([FIELD_1],''''),ISNULL([FIELD_2],'''') FROM view_Table'
SELECT @Temp