带有 REPLACE 语句的动态 SQL 错误
Posted
技术标签:
【中文标题】带有 REPLACE 语句的动态 SQL 错误【英文标题】:Dynamic SQL Error with REPLACE Statement 【发布时间】:2015-08-17 16:58:22 【问题描述】:我正在尝试创建一个动态构建 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 是由服务器直接处理的。会不会是工作室先处理了一些,然后再交给服务器,如果工作室有“问题”,就会导致奇怪的错误?
无论如何,非常感谢你们的意见,我很抱歉这是一个车轮旋转器。我从来没有想过重启会解决我的问题,我只是认为我的代码是错误的。
【问题讨论】:
列ScoringDates
的数据类型是什么?
请向我们展示创建@strSQL
变量内容的代码,那里似乎缺少一些东西。
我用请求的信息更新了我的 OP。
【参考方案1】:
你想用''替换'/
所以你的 set 语句将类似于...
SET @strSQL = 'UPDATE DNN_RSM_Exams
SET ScoringDates = REPLACE(ScoringDates, ''2015'', ''2016'')
WHERE SchoolYear = 2015'
编辑: 您的代码与下面的代码有何不同? (我将再次编辑并清理它。代码不适合 cmets)
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)
【讨论】:
嗨@Hogan,如果您重新阅读该问题,您会看到该人正在将 SQL 分配给一个变量,然后在该变量中执行 SQL。我也很困惑,直到我重读了几遍。 对,就是动态SQL的定义。但根据问题,屏幕上显示的是在该字符串上执行打印的结果,而不是生成字符串的代码。但我同意你的看法……这可能就是问题所在,我们只是还看不到那个代码。我添加了一条评论。 我读的方式是他正在使用 print 验证字符串的输出。我认为我们需要原始问题作者的一些验证。 查看上面的编辑。运行一下,是不是还是一样的错误?以上是关于带有 REPLACE 语句的动态 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章