SQL-представление должно возвращать исполняемые строки, включая запятую полей

80
8

Бизнес-правило - нужно создать представление, которое получает все значения (или некоторые из них), формируя поля таблицы в одно поле string/varchar. И чем я смог бы скопировать эти ценности в другую среду.

Простой пример (фактически используя поля 30+):

id          int (autoincrement);
indicator int
name varchar
description varchar
relevance varchar
object_fk int

Некоторые поля могут быть пустыми.

SELECT
'INSERT INTO [DM_meta].[dbo].[measure] (
id, indicator, name, description, relevance, object_fk
)
VALUES ('
+ CAST(id AS varchar(20)) + ', '
+ ISNULL(indicator,'NULL') + ', '
+ ISNULL(name,'NULL') + ', '
+ ISNULL(description,'NULL') + ', '
+ ISNULL(relevance,'NULL') + ', '
+ ISNULL(CAST(object_fk AS varchar(20)),'NULL')
+ ');
' AS _long_strings_to_coply_later_
FROM
[DM_meta].[dbo].[measure]

Для того чтобы внешний вид одного ожидаемого результата был прекрасен, кроме поля описания с точками и запятыми:

INSERT INTO [DM_meta].dbo.measure (идентификатор, индикатор, имя, описание, релевантность, object_fk) VALUES (1103, NULL, NULL, 1.8.8.3. Lorem ipsum, где что-то, что-то и многое другое, да, 70);

Поэтому возникает вопрос: как создать поле описания в одной строке без разграничения запятой и вызывать синтаксическую ошибку.

спросил(а) 2014-09-15T12:55:00+04:00 6 лет назад
1
Решение
80

Если целевой средой является база данных SQL Server, вам нужно отформатировать свой вывод для предоставления действительных операторов SQL.

В T-SQL строки цитируются символом одиночной кавычки ('). Вы должны указывать строки в своих выходных строках.

пример

SELECT
'''' + name + ''''
FROM
[DM_meta].[dbo].[measure]

Возможно, что исходная строка содержит кавычки. Вы должны избегать этих кавычек:

SELECT
'''' + REPLACE(name, '''', '''''') + ''''
FROM
[DM_meta].[dbo].[measure]

В T-SQL вы можете избежать одиночной кавычки, удвоив ее. Запустите это утверждение, чтобы понять, как работает экранирование:

SELECT
'''' AS OneQuotation,
'''''' AS TwoQuotations

Ваш запрос должен выглядеть примерно так:

SELECT
'INSERT INTO [DM_meta].[dbo].[measure] (
id, indicator, name, description, relevance, object_fk
)
VALUES ('
+ CAST(id AS varchar(20)) + ', '
+ ISNULL(indicator,'NULL') + ', '
+ ISNULL('''' + REPLACE(name, '''', '''''') + '''','NULL') + ', '
+ ISNULL('''' + REPLACE(description, '''', '''''') + '''','NULL') + ', '
+ ISNULL('''' + REPLACE(relevance, '''', '''''') + '''','NULL') + ', '
+ ISNULL('''' + REPLACE(CAST(object_fk AS varchar(20)), '''', '''''') + '''','NULL')
+ ');
' AS _long_strings_to_coply_later_
FROM
[DM_meta].[dbo].[measure]

Дополнительные замечания

Обратите внимание, что если целевое окружение является сервером базы данных, вы можете использовать Связанные серверы для передачи данных с одного сервера на другой.

Если Linked Server не является вариантом, попробуйте использовать службы SSIS (службы интеграции SQL Server) для генерации или обработки файлов.

ответил(а) 2014-09-15T15:02:00+04:00 6 лет назад
40

Попробуйте передать значение в кавычках.


попробуйте заменить ISNULL (описание, 'NULL') на char (39) + ISNULL (описание, 'NULL') + char (39) или '' '' + ISNULL (описание, 'NULL') + '' ''

ответил(а) 2014-09-15T13:10:00+04:00 6 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема