我正在尝试创建一个动态构建 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:2015 年 8 月 17 日
抱歉,如果我最初没有提供足够的信息...
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:2015 年 8 月 18 日
所以我完全惊呆了……昨天在这个剧本上敲了几个小时后,我沮丧地回家了。今天进来,启动我的电脑并再次运行脚本,这样我就可以再次看到错误消息......它工作了!
我从来没有在 SQL Management Studio 中遇到过这种情况,但是 SQL Management Studio 昨天可能以某种方式丢失了它的弹珠并需要重新启动?我认为 SQL 是由服务器直接处理的。会不会是工作室先处理了一些,然后再将其交给服务器,如果工作室有“问题”,那么它会导致奇怪的错误?
无论如何,非常感谢你们的投入,我很抱歉这是一个车轮旋转器。我从来没有想过重启会解决我的问题,我只是假设我的代码是错误的。