Ошибка динамического SQL с оператором REPLACE

Я пытаюсь создать сценарий, который динамически создает оператор SQL, а затем выполняет его.

Вот строка, которая построена и хранится в @strSQL (проверено с помощью PRINT)

UPDATE DNN_RSM_Exams 
SET ScoringDates = REPLACE(ScoringDates, '/2015', '/2016') 
WHERE SchoolYear = 2015

Он выполняет переменную следующим образом:

EXECUTE (@strSQL)

Однако я получаю следующую ошибку:

Ошибка преобразования при преобразовании значения nvarchar 'UPDATE DNN_RSM_Exams SET ScoringDates = REPLACE(ScoringDates, '/'в тип данных int.

Кажется, прекратить EXECUTE когда он попадает в первую косую черту (/). Я попытался избежать его с помощью двойной косой черты (//), открытой скобки ([) и обратной косой черты (\). Нет, если это сработало.

Кто-нибудь может мне помочь?

ОБНОВЛЕНИЕ № 01: 17.08.15

Извините, если я не дал достаточно информации изначально...

ScoringDates - это поле NVARCHAR(MAX).

Код, который создает инструкцию SQL:

SET @strSQL = 'UPDATE ' + @strTableName +
              ' SET ScoringDates = REPLACE(ScoringDates, ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 1))) + ''', ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 2))) + ''')' +
              ' WHERE SchoolYear = ' + LTRIM(RTRIM(STR(@intSchoolYear_CopyTo)))

ScoringDates - это строковое поле, которое содержит данные в формате INI-подобной строки. Я хочу изменить часть года ЛЮБОЙ даты, найденной в строке, но я хочу избежать случайных изменений любых других чисел, которые могут совпадать. Поэтому я специально пытаюсь заменить "/YYYY" другим значением "YYYY". Символ "/", предшествующий значению года, должен гарантировать, что то, что подставляется, - это ГОД, а не другое числовое значение в строке.

ОБНОВЛЕНИЕ № 02: 18.08.15

Так что я совершенно ошеломлен... вчера я несколько часов бился головой об этом сценарии и потерпел поражение. Приходите сегодня, запустите мой компьютер и снова запустите скрипт, чтобы я мог снова увидеть сообщение об ошибке... и это сработало!

Я никогда не сталкивался с этим с SQL Management Studio, но возможно, что SQL Management Studio вчера как-то потеряли свои шарики и нуждались в перезагрузке? Я думал, что SQL обрабатывается сервером напрямую. Может ли быть так, что некоторые обрабатываются студией в первую очередь, прежде чем передать их на сервер, и если в студии возникают "проблемы", то это вызывает странные ошибки?

В любом случае, большое спасибо, ребята, за ваш вклад, извините, что это был прядильщик колеса. Мне никогда не приходило в голову, что перезагрузка исправит мою проблему, я просто предположил, что мой код был неправильным.

1 ответ

Вы хотите заменить '/ на''

Таким образом, ваше сетевое утверждение будет что-то вроде...

SET @strSQL = 'UPDATE DNN_RSM_Exams 
    SET ScoringDates = REPLACE(ScoringDates, ''2015'', ''2016'') 
    WHERE SchoolYear = 2015'

РЕДАКТИРОВАТЬ: Как ваш код отличается от этого ниже? (Я отредактирую это снова и уберу после. Код просто не помещается в комментарии)

DECLARE @TableName TABLE (ScoringDates VARCHAR(100), SchoolYear INT)

DECLARE @strTableName VARCHAR(MAX)
DECLARE @intSchoolYear_CopyFrom VARCHAR(MAX)
DECLARE @intSchoolYear_CopyTo VARCHAR(MAX)

SET @strTableName = '@TableName'
SET @intSchoolYear_CopyFrom = '2009'
SET @intSchoolYear_CopyTo = '2010'

DECLARE @strSQL VARCHAR(MAX)

SET @strSQL = 'DECLARE @TableName TABLE (ScoringDates VARCHAR(100), SchoolYear INT); UPDATE ' + @strTableName +
              ' SET ScoringDates = REPLACE(ScoringDates, ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 1))) + ''', ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 2))) + ''')' +
              ' WHERE SchoolYear = ' + LTRIM(RTRIM(STR(@intSchoolYear_CopyTo)))

PRINT @strSQL

EXECUTE (@strSQL)
Другие вопросы по тегам