我正在尝试创建一个动态构建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
。我尝试使用双斜杠(//),开括号([)和反斜杠(\)来转义它。没有,如果它工作。
有人可以帮我吗?
很抱歉,如果我最初没有提供足够的信息......
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”。年份值之前的“/”是为了确保预先放置的是YEAR而不是字符串中的另一个数值。
所以我完全被大吃一惊......昨天在这个剧本上敲了好几个小时之后,我回到家里被击败了。今天进来,启动我的电脑并再次运行脚本,这样我就可以再次看到错误消息......它有效!
我从来没有遇到过SQL Management Studio,但是SQL管理工作室有可能在某种程度上丢失了它的弹珠并需要重新启动吗?我认为SQL是由服务器直接处理的。可能是某些工作室在将其交给服务器之前首先由工作室处理,如果工作室有“问题”,那么它会导致奇怪的错误吗?
无论如何,非常感谢你们的投入,我很抱歉这是一个轮子旋转器。我从未想过重启会解决我的问题,我只是假设我的代码错了。
答案 0 :(得分:0)
您想要用''
替换' /所以你的set语句就像......
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)