使用REPLACE语句的动态SQL错误



我正在尝试创建一个脚本,动态地构建一个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值之前的"/"是为了确保被放置的是year,而不是字符串中的另一个数字值。

更新#02:8/18/15

所以我完全惊呆了…昨天在这个剧本上苦思冥想了几个小时后,我失败地回家了。今天进来,启动我的电脑,再次运行脚本,这样我就可以再次看到错误信息……这招奏效了!

我从来没有遇到过这个与SQL管理工作室,但它是可能的SQL管理工作室不知怎的失去了它的大理石昨天,需要重新启动?我认为SQL是由服务器直接处理的。会不会是工作室先处理了一些,然后才把它交给服务器,如果工作室有"问题",就会导致奇怪的错误?

在任何情况下,非常感谢你的输入,我很抱歉,这是一个车轮旋转。我从来没有想过重启会解决我的问题,我只是认为我的代码是错误的。

你想用"

"代替'/"

那么你的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)

相关内容

  • 没有找到相关文章

最新更新