REPLACE语句

时间:2015-08-17 16:58:22

标签: tsql sql-server-2008-r2 sql-manager

我正在尝试创建一个动态构建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:8/17/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”。年份值之前的“/”是为了确保预先放置的是YEAR而不是字符串中的另一个数值。

更新#02:8/18/15

所以我完全被大吃一惊......昨天在这个剧本上敲了好几个小时之后,我回到家里被击败了。今天进来,启动我的电脑并再次运行脚本,这样我就可以再次看到错误消息......它有效!

我从来没有遇到过SQL Management Studio,但是SQL管理工作室有可能在某种程度上丢失了它的弹珠并需要重新启动吗?我认为SQL是由服务器直接处理的。可能是某些工作室在将其交给服务器之前首先由工作室处理,如果工作室有“问题”,那么它会导致奇怪的错误吗?

无论如何,非常感谢你们的投入,我很抱歉这是一个轮子旋转器。我从未想过重启会解决我的问题,我只是假设我的代码错了。

1 个答案:

答案 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)