0

我正在尝试创建一个动态构建 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 是由服务器直接处理的。会不会是工作室先处理了一些,然后再将其交给服务器,如果工作室有“问题”,那么它会导致奇怪的错误?

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

4

1 回答 1

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)
于 2015-08-17T17:12:02.433 回答