Сбой вставки SQL Server с операциями SET - PullRequest
0 голосов
/ 12 октября 2018

Я получаю эту ошибку:

Не удалось выполнить INSERT, поскольку следующие параметры SET имеют неправильные настройки: 'ANSI_NULLS'.Убедитесь, что параметры SET верны для использования с индексированными представлениями и / или индексами для вычисляемых столбцов и / или отфильтрованных индексов и / или уведомлений о запросах, и / или методов типа данных XML, и / или операций с пространственным индексом.

Я конкатенировал переменные с '^', используя путь XML, но заметил, что некоторые символы будут неправильно отформатированы (т.е. & становится &), поэтому я добавил:

, TYPE).value('.[1]', 'varchar(max)'

Но сейчасЯ получаю сообщение об ошибке, показанное выше.

SELECT 
    SUBSTRING((SELECT 
                   '^' + CONVERT(nvarchar(max), ST1.[planId]) AS [text()]
               FROM STable ST1
               WHERE ST1.cid = ST2.cid
               ORDER BY ST1.cid
               FOR XML PATH (''), TYPE).value('.[1]', 'varchar(max)'), 2, 1000) [planId] 
FROM 
    dbo.STable ST2

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Эта ошибка зависит от того, как SQL-сервер сконфигурирован для разрешения COLLATE.Для вашего конкретного случая использования этого сервера вы должны указать COLLATE (различных доступных на вашем сервере) для каждого оператора.

SELECT 
SUBSTRING((SELECT 
               '^' + CONVERT(nvarchar(max), ST1.[MilestoneId]) COLLATE Latin1_General_CI_AS AS [text()]
           FROM STable ST1
           WHERE ST1.cid = ST2.cid
           ORDER BY ST1.cid
           FOR XML PATH (''), TYPE).value('.[1]', 'varchar(max)'), 2, 1000) [planId] 
FROM 
dbo.STable ST2 

Также пересоздать или изменить хранимую процедуру (если вы ее уже создали) изсеанс с включенным QUOTED_IDENTIFIER и ANSI_NULLS, чтобы избежать дальнейшей проблемы.

0 голосов
/ 12 октября 2018
SELECT REPLACE(SELECT SUBSTRING(
            (
                SELECT 
                '^'+CONVERT(nvarchar(max), ST1.[planId])  AS [text()]
                FROM STable ST1
                WHERE ST1.cid= ST2.cid
                ORDER BY ST1.cid
                FOR XML PATH (''), TYPE).value('.[1]', 'varchar(max)'
            ), 2, 1000) [planId] 
FROM dbo.STable ST2
,'&amp','&');
...