Ошибка динамического 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)